(function () {
var win = window,
$ = win.jQuery;
var ApiDomain = window.ApiDomain || {};
/**
* prefix: api 경로 집합,
* [임시 대처]일부 api는 전문몰 도메인으로 호출 해야하는 경우가 있어 옵션변경레이어 호출 시, prefix 변경하는 경우가 있음
* keyName: api response 값의 key 집합,
* getApi: 상품상세 api 호출 공통 메서드
*/
win.itemUris = {
itemApi: '/v1/item/detail/api', // 메인
optionApi: '/v1/item/option/api', // 옵션목록
siteUitemNameApi: '/v1/item/siteitem/uitemName/api',
uitemNameApi: '/v1/item/uitemName/api', // 사은품
uitemApi: '/v1/item/uitem/api', // 단품
jwUitemApi: '/api/d/items/jewelry/price', // 쥬얼리단품
reviewApi: '/v1/item/review/api', // 리뷰
qnaApi: '/v1/item/qna/api', // qna
couponApi: '/api/i/items/{itemNo}/lowervends/{lowerVendNo}/coupons', // 쿠폰
}
win.itemApis = {
prefix: {
itemApi: ApiDomain.www + itemUris.itemApi,
optionApi: ApiDomain.www + itemUris.optionApi,
siteUitemNameApi: ApiDomain.www + itemUris.siteUitemNameApi,
uitemNameApi: ApiDomain.www + itemUris.uitemNameApi,
uitemApi: ApiDomain.www + itemUris.uitemApi,
jwUitemApi: ApiDomain.www + itemUris.jwUitemApi,
reviewApi: ApiDomain.www + itemUris.reviewApi,
qnaApi: ApiDomain.www + itemUris.qnaApi,
couponApi: ApiDomain.www + itemUris.couponApi,
imgPath: '//item.elandrs.com/upload'
},
keyName: {
itemApi: 'itemMain',
optionApi: 'itemOption',
uitemApi: 'uitem',
qnaApi: 'qna'
},
getApi: function (props) {
var deferred = $.Deferred();
eAjax.get(props).done(function (response) {
deferred.resolve(response);
}).fail(function () {
deferred.reject();
});
return deferred.promise();
}
};
})();
(function (global, factory) {
global = global;
global.itemDetail = factory();
}(this, function () { 'use strict';
var Component = (function (isUndefined) {
var win = window,
$ = win.jQuery,
Util = win.EB.util;
/**
* 옵션의 레이어가 열린 상태에서 특정레이어(예: 로그인, 입고알림) 열릴때, 닫히지 않도록 하는 메서드
*/
var AllLayer = (function () {
var r = {
stateAttr: {
opened: false
},
exceptionClass: ['cp-detail-pop'],
hasCondition: function ($el) {
var a = this;
var r = false;
var hasE = (function () {
var hr = false;
a.exceptionClass.forEach(function (e) {
if ($el.hasClass(e)) {
hr = true;
}
});
return hr;
})();
if (hasE) {
r = true;
} else {
if ($el.find('.detail-option-section').length) {
r = true;
}
}
return r;
},
getHasLayer: function (hasLayer) {
var a = this;
var r = hasLayer.filter(function (inst) {
return !a.hasCondition(inst.INSTANCE.layerWrap);
});
return r;
},
build: function (e, data) {
var a = this;
var $layer = data.$el;
var hasE = (function () {
var r = false;
a.exceptionClass.forEach(function (e) {
if ($layer.hasClass(e)) {
r = true;
}
});
return r;
})();
if (hasE) return;
var INSTANCE = $layer.data('CmLayer');
if ((INSTANCE != isUndefined) && !INSTANCE.hasOwnProperty('$$ITEMDETAILLAYER')) {
INSTANCE['$$ITEMDETAILLAYER'] = true;
$layer.on('layerOpenStart', function () {
if (!a.hasCondition($layer)) {
this.stateAttr.opened = true;
}
}.bind(this));
$layer.on('layerCloseAfter', function () {
var hasLayer = this.getHasLayer(INSTANCE.hasLayer);
if (!hasLayer.length) {
this.stateAttr.opened = false;
}
}.bind(this));
}
},
init: function () {
var a = this;
var $layers = $('.cm-layer');
for (var i = 0, max = $layers.length; i < max; i++) {
(function (idx) {
var $layer = $layers.eq(idx);
var INSTANCE = $layer.data('CmLayer');
if (INSTANCE != isUndefined) {
a.build(null, {
$el: $layer
});
}
})(i);
}
$('body').on('CmLayerInit', this.build.bind(this));
}
};
r.init();
return r;
})();
function Component (container, args) {
/**
* datas: 생성자 호출시 값이 있으면 api 타지 않고, 해당 datas 로 구현
* navigation:
* message: 문구 집합
* parentOpts: 상품상세기능레이어 용
* toolbarSync: 툴바와 싱크를 맞추는 옵션
*/
var defParams = {
itemNo: '2108239956',
datas: null,
navigation: null,
toggleBtn: '[data-toggle-active]',
toggleList: '[data-toggle-list]',
message: {
inputTxt: '문구입력',
giftSoldOut: '사은품이 조기 소진되었습니다.',
uitemMin: '상품은 최소 {{N}}개 이상 주문 가능합니다.',
uitemMax: '상품은 최대 {{N}}개까지 주문 가능합니다.'
},
parentOpts: null,
toolbarSync: false,
customLabel: (function () {
return ('' + Math.random()).replace('.', '');
})(),
classAttr: {
active: 'active',
disabled: 'disabled'
},
customEvent: '.Component' + (new Date()).getTime() + Math.random(),
on: {
selectedBefore: null,
selected: null,
loaded: null
}
};
this.opts = Util.def(defParams, (args || {}));
if (!(this.$el = $(container)).length) return;
this.init();
};
Component.prototype = {
datas: {},
jewelry: false,
itemNo: null,
itemTcode: null,
init: function () {
/**
* setElements: DOM 접근을 위한 선택자 집합
* buildMakeHtml: DOM 구성을 위한 메서드 (옵션, 컬러칩, 사은품, 가격, 구성상품 등)
* buildDelivery: 수령방법 선택에 따른 함수 로직 (택배배송, 매장수령)
* buildProduct: 단독상품(alone), 딜상품/세트상품(bundle) 등에 따른 함수 로직
* buildParams: 공통으로 사용되는 옵션을 위한 메서드
* buildLoader: api 호출되는 시간동안 노출되는 loader 관련 메서드
* buildJwForm: 쥬얼리 관련된 DOM 구성을 위한 메서드
* buildMethods: 이벤트시 일어나는 DOM 속성 변경에 대한 메서드
* buildFocusItem: 옵션 레이어 클릭시 아웃사이드 활성화를 위한 메서드
* bindEvents: DOM 이벤트 실행 함수 집합
*/
this.setElements();
this.buildMakeHtml();
this.buildDelivery();
this.buildCalendar();
this.buildProduct();
this.buildParams();
this.buildLoader();
this.buildJwForm();
this.buildMethods();
this.buildFocusItem();
this.bindEvents(true);
var startUp = function (itemNo, origin, navigation) {
var clone = Util.def({}, origin);
// console.log(clone);
this.datas[itemNo] = {
origin: origin,
data: clone,
navigation: navigation
};
this.itemNo = itemNo;
this.itemTcode = clone.itemTcode;
this.jewelry = clone.jwYn == 'Y';
this.product.toolbar.init();
if (clone.itemTcode == '70' || clone.itemTcode == '80') {
this.product.bundle.init(itemNo);
if (clone.itemTcode == '80') {
this.$selectDeliveryWrap.addClass('is-hide');
}
} else {
this.product.alone.init(itemNo);
}
this.outCallback('loaded', {
datas: this.datas,
itemNo: itemNo
});
}.bind(this);
if ((this.opts.datas != null) && (this.opts.itemNo != null)) {
startUp(this.opts.itemNo, this.opts.datas, this.opts.navigation);
} else {
this.params.getMainApi().done(function (response) {
var aResponse = response;
if (aResponse.resultCode == 200) {
var origin = aResponse.data['itemDetail'][itemApis.keyName.itemApi];
var navigation = aResponse.data['itemDetail']['navigation'];
startUp(origin.itemNo, origin, navigation);
}
});
}
this.$el.data('itemDetail', this);
},
setElements: function () {
this.$body = $('body');
this.$productImgWrap = this.$el.find('.product-img_wrap');
this.$productInfoWrap = this.$el.find('.product-info_wrap');
this.$optionSection = this.$el.find('.detail-option-section');
this.$basicOptionWrap = this.$optionSection.find('[data-option-basicwrap]');
this.$basicGiftWrap = this.$optionSection.find('[data-gift-basicwrap]');
this.$selectOptionWrap = this.$optionSection.find('[data-option-selectwrap]');
this.$priceOptionWrap = this.$el.find('[data-option-pricewrap]');
this.$selectDeliveryWrap = this.$optionSection.find('[data-delivery-selectwrap]');
},
buildMakeHtml: function () {
var _this = this;
var message = this.opts.message;
Util.def(this, {
makehtml: {
get: {
optionType: function (prop) {
var data = prop.data;
var idx = prop.idx != isUndefined ? '_' + prop.idx : '';
var itemOptionTypeInputNo = data.itemOptionTypeInputNo;
var itemOptionTypeName = data.itemOptionTypeName;
var itemOptionTcode = data.itemOptionTcode;
var jwTextCondition = (function () {
var aJw = ['IS', 'OS'];
return _this.jewelry && (aJw.indexOf(data.itemOptionTypeInputNo) != -1);
})();
var soldoutLabel = 'soldoutLabel_' + prop.name + idx + '_' + itemOptionTypeInputNo + '_' + _this.opts.customLabel;
var layouts = [];
layouts.push('
');
layouts.push('' + itemOptionTypeName + '
');
layouts.push('');
layouts.push('
');
if (itemOptionTypeName == '색상') {
layouts.push('
');
layouts.push('
');
layouts.push('
');
}
layouts.push('
');
layouts.push(' ');
return layouts.join('');
},
optionTypes: function (props) {
var g = this;
var datas = props.datas;
var layouts = [];
datas.forEach(function (data) {
layouts.push(g.optionType({
name: props.name,
idx: props.idx,
data: data
}));
});
return layouts.join('');
},
optionItem: function (prop) {
var data = prop.data;
var orderNum = prop.orderNum;
var itemLength = prop.itemLength;
var jwTextCondition = prop.jwTextCondition;
if (_this.jewelry) {
var itemNo = prop.itemNo;
} else {
var itemNo = data.itemNo;
}
if (_this.product.state == 'bundle') {
var getData = _this.product.bundle.getData(itemNo);
} else {
var getData = _this.params.getData(itemNo);
}
var gLowerVendNo = getData.lowerVendNo;
var lowerVendNo = getData.manyUitemYn == 'N' ? gLowerVendNo : data.lowerVendNo;
var itemOptionName = data.itemOptionName;
var itemOptionNo = data.itemOptionNo;
var sellPrice = data.sellPrice;
var soldoutYn = data.soldoutYn;
var reWhsInNotificPossYn = data.reWhsInNotificPossYn;
var standardItemOptionImageCon = data.standardItemOptionImageCon;
var standardItemOptionName = data.standardItemOptionName;
var jwTextAttr = jwTextCondition ? ' data-jw-option' : '';
var soldoutClass = soldoutYn == 'N' ? '' : ' class="sold_out"';
var itemOptionNameParse = itemOptionName;
var layouts = [];
let reWhsInLoginPromiseData = data.reWhsInLoginPromiseData;
if (_this.jewelry) {
var jwOptionLength = data.jwOptionLength;
if (jwTextCondition && (itemOptionName != '사용안함')) {
itemOptionNameParse = message.inputTxt;
}
layouts.push('');
} else {
var itemOptionTcode = data.itemOptionTcode;
// 날짜일 경우
if ((_this.calendar.instance != null) && (itemOptionTcode === '30') && (soldoutYn != 'Y')) {
_this.calendar.itemLength = itemLength;
_this.calendar.orderNum = prop.orderNum;
_this.calendar.data.push(prop);
}
layouts.push(' ');
}
if (soldoutYn == 'Y') {
layouts.push('');
} else {
layouts.push('');
}
layouts.push(' ');
return layouts.join('');
},
optionItems: function (props) {
var g = this;
var datas = props.datas;
var itemNo = props.itemNo;
var getItemDatas = props.getItemDatas;
var orderNum = getItemDatas != isUndefined ? getItemDatas.getItems.index(getItemDatas.willLoadElement) : null;
var itemLength = getItemDatas != isUndefined ? getItemDatas.getItems.length: null;
var $willLoadElement = getItemDatas.willLoadElement;
var jwTextCondition = (function () {
var aJw = ['IS', 'OS'];
return _this.jewelry && (aJw.indexOf($willLoadElement.attr('data-itemoptiontype_inputno')) != -1);
})();
if (jwTextCondition) {
datas.push({
itemOptionName: '사용안함',
soldoutYn: 'N'
});
}
var layouts = [];
let reWhsInLoginPromiseData = props.reWhsInLoginPromiseData;
datas.forEach(function (data) {
data["reWhsInLoginPromiseData"] = reWhsInLoginPromiseData;
layouts.push(g.optionItem({
data: data,
itemNo: itemNo,
orderNum: orderNum,
itemLength: itemLength,
jwTextCondition: jwTextCondition
}));
});
return layouts.join('');
},
optionChipItem: function (prop) {
var data = prop.data;
var idx = prop.idx;
var optionType = prop.optionType;
var standardItemOptionImageCon = data.standardItemOptionImageCon;
var standardItemOptionName = data.standardItemOptionName;
var soldoutYn = data.soldoutYn;
var layouts = [];
if (soldoutYn == 'N') {
if (optionType == '색상') {
if (standardItemOptionImageCon != isUndefined) {
if (_this.jewelry) {
var itemNo = prop.itemNo;
} else {
var itemNo = data.itemNo;
}
var lowerVendNo = data.lowerVendNo;
var itemOptionName = data.itemOptionName;
var itemOptionNo = data.itemOptionNo;
var itemOptionTcode = data.itemOptionTcode;
var itemOptionTypeInputNo = data.itemOptionTypeInputNo;
var gName = idx + '_' + itemNo + '_' + itemOptionTypeInputNo;
var labelName = idx + '_' + itemOptionNo + '_' + itemOptionTypeInputNo;
var soldoutClass = soldoutYn == 'N' ? '' : ' class="sold_out"';
var soldoutDiable = soldoutYn == 'N' ? '' : ' disabled="disabled"';
var whiteClass = (standardItemOptionImageCon != null && standardItemOptionImageCon.toLowerCase() == '#ffffff') ? ' class="white"' : '';
layouts.push('');
layouts.push(' ');
layouts.push('');
if (standardItemOptionImageCon != null) {
if (standardItemOptionImageCon.toLowerCase() === "mix") {
layouts.push('');
} else {
layouts.push('');
}
} else {
layouts.push('');
}
layouts.push(itemOptionName);
layouts.push(' ');
layouts.push(' ');
layouts.push(' ');
}
}
}
return layouts.join('');
},
optionChipItems: function (props) {
var g = this;
var datas = props.datas;
var itemNo = props.itemNo;
var getItemDatas = props.getItemDatas;
var optionType = getItemDatas.willLoadElement.attr('data-itemoptiontype_name');
var $itemList = props.$itemList;
var $itemNo = $itemList.closest('[data-item_no]');
var $compositionIdx = $itemList.closest('[data-composition_idx]');
var idx = $itemNo.attr('data-item_no');
if ($compositionIdx.length) {
idx = $compositionIdx.attr('data-composition_idx');
}
var layouts = [];
datas.forEach(function (data) {
layouts.push(g.optionChipItem({
data: data,
itemNo: itemNo,
idx: idx,
optionType: optionType
}));
});
return layouts.join('');
},
itemList: function (props) {
var name = props.name;
var layouts = [];
layouts.push('');
return layouts.join('');
},
giftType: function (props) {
var layouts = [];
layouts.push('');
layouts.push('사은품
');
layouts.push('');
layouts.push('
');
layouts.push('
');
layouts.push(' ');
return layouts.join('');
},
giftItem: function (prop) {
var data = prop.data;
var itemNo = data.itemNo;
var uitemNo = data.uitemNo;
var uitemName = data.uitemName;
var lowerVendNo = data.lowerVendNo;
var sellEndYn = data.sellEndYn;
var sellPossQty = data.sellPossQty;
var soldoutClass = (sellEndYn != 'Y') && (sellPossQty > 0) ? '' : ' class="sold_out"';
var layouts = [];
layouts.push('');
layouts.push('');
layouts.push('');
layouts.push('' + uitemName + ' ');
layouts.push(' ');
layouts.push(' ');
layouts.push(' ');
return layouts.join('');
},
giftItems: function (props) {
var g = this;
var datas = props.datas;
var hasAllSoldout = (function () {
var r = false;
var c = 0;
datas.forEach(function (d) {
var sellEndYn = d.sellEndYn;
var sellPossQty = d.sellPossQty;
if ((sellEndYn == 'Y') || (sellPossQty < 1)) {
c++;
}
});
if (c == datas.length) {
r = true;
}
return r;
})();
var layouts = [];
if (hasAllSoldout) {
layouts.push(message.giftSoldOut);
} else {
datas.forEach(function (data) {
layouts.push(g.giftItem({
data: data
}));
});
}
var prop = {
hasAllSoldout: hasAllSoldout,
html: layouts.join('')
};
return prop;
},
priceItem: function (props) {
var gDatas = _this.datas;
var data = props.data;
var itemNo = props.itemNo;
var delivery = props.delivery;
var params = _this.params;
var onlyPrice = props.onlyPrice;
var getData = params.getData(itemNo);
var giftCondition = (function () {
if (_this.jewelry) {
return !getData.itemOptionType.length;
} else {
return (getData.manyUitemYn == 'N') && (!getData.itemOptionType.length);
}
})();
if (_this.jewelry) {
var $itemList = props.$itemList;
var getItemDatas = params.getItemDatas($itemList);
var uitemName = (function () {
var r = [];
var $getItems = getItemDatas.getItems;
var selectedNames = getItemDatas.selectedNames;
for (var gm = 0, gx = $getItems.length; gm < gx; gm++) {
var $getItem = $getItems.eq(gm);
var key = $getItem.attr('data-itemoptiontype_name');
r.push(key + ':' + selectedNames[gm]);
}
return r.join(' / ');
})();
var dispItemPrice = data.Price;
var min = 1;
} else {
if (giftCondition) {
var uitemName = getData.itemName;
} else {
var uitemName = data.uitemName;
}
var dispItemPrice = data.dispItemPrice;
var min = data.purchasePossMiniQty;
}
var title = (function () {
var r = [];
if (delivery != isUndefined) {
r.push('[' + delivery.text + '] ');
}
r.push(uitemName);
if (props.hasOwnProperty('giftValue')) {
r.push(' ');
r.push('사은품 : ');
r.push(props.giftValue);
}
return r.join('');
})();
var reservationSendStartDt = (function () {
var r = [];
var origin = gDatas[props.itemNo].origin;
if (origin.shipStartDayAllApplyYn === 'N') {
if ('sendStartDt' in data) {
const date = new Date(data.sendStartDt);
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
const dayNames = ['일', '월', '화', '수', '목', '금', '토'];
const dayOfWeek = dayNames[date.getDay()];
r.push('' + month + '.' + day + '(' + dayOfWeek + ') 이후에 순차 발송 예정 ');
}
}
return r.join('');
})();
var oApplyMplusNProm = (function () {
var r = null;
if (!_this.jewelry) {
const selectedItem = props.selectedItem;
const applyMplusNProm = selectedItem.applyMplusNProm;
if (!applyMplusNProm || JSON.stringify(applyMplusNProm) === "{}") {
return r;
}
if ((applyMplusNProm.benefitConditionValue != null) && (applyMplusNProm.benefitValue != null)) {
r = {
benefitConditionValue: applyMplusNProm.benefitConditionValue,
benefitValue: applyMplusNProm.benefitValue
};
}
}
return r;
})();
var price = (min * dispItemPrice);
var dataItemName = (function () {
var origin = gDatas[props.itemNo].origin;
var r = {};
r['item_name'] = origin.itemName;
r['brand_name'] = origin.brandName;
r['uitem_name'] = data.uitemName;
return r;
})();
var layouts = [];
layouts.push('');
layouts.push('' + title);
if (reservationSendStartDt != null) {
layouts.push(reservationSendStartDt);
}
layouts.push('
');
layouts.push('');
if (oApplyMplusNProm != null) {
layouts.push('
' + oApplyMplusNProm.benefitConditionValue + ' 개 구매시 ' + oApplyMplusNProm.benefitValue + ' 개 더 증정 (교차구매불가)
');
}
layouts.push('
수량 감소 ');
layouts.push('
수량 증가 ');
layouts.push('
');
layouts.push(' ');
layouts.push(' ');
layouts.push('
');
layouts.push('');
layouts.push('' + _this.params.getCurrency(price) + ' 원');
layouts.push('
');
if (!onlyPrice) {
layouts.push('');
layouts.push('delete ');
layouts.push(' ');
}
layouts.push(' ');
return layouts.join('');
},
priceBundleItem: function (props) {
var itemTcode = _this.itemTcode;
var data = props.data;
var delivery = props.delivery;
var getData = _this.params.getData(_this.opts.itemNo);
var title = (function () {
var r = [];
if (delivery != isUndefined) {
r.push('[' + delivery.text + '] ');
}
data.forEach(function (item) {
var itemCompositionGroupName = (function () {
if (_this.itemTcode == '80') {
if (getData.countRepresentPriceY <= 1) {
return '';
} else {
return '' + item.compositionItem.itemCompositionGroupName + ' ';
}
} else {
return '' + item.compositionItem.itemCompositionGroupName + ' ';
}
})();
r.push(itemCompositionGroupName + item.selected.origin.title);
if (item.selected.origin.data.hasOwnProperty('giftValue')) {
r.push('사은품 : ' + item.selected.origin.data.giftValue);
}
});
return r.join(' ');
})();
var isJewelry = _this.jewelry;
var min = (function () {
if (itemTcode === '70') {
return getData.purchasePossMiniQty;
} else if (itemTcode === '80') {
if (isJewelry) {
return 1;
}
return data[0].selected.origin.data.purchasePossMiniQty;
}
})();
var oApplyMplusNProm = (function () {
var r = null;
if (!isJewelry) {
if (itemTcode === '80') {
const applyMplusNProm = data[0].selected.selectedItem.applyMplusNProm;
if (!applyMplusNProm || JSON.stringify(applyMplusNProm) === "{}") {
return r;
}
if ((applyMplusNProm.benefitConditionValue != null) && (applyMplusNProm.benefitValue != null)) {
r = {
benefitConditionValue: applyMplusNProm.benefitConditionValue,
benefitValue: applyMplusNProm.benefitValue
};
}
}
}
return r;
})();
var price = (function () {
var r = 0;
var priceName = (itemTcode === '70') ? 'sellPrice' : (isJewelry) ? 'Price' : 'dispItemPrice';
if (isJewelry) {
r = data[0].selected.origin.data.Price;
} else {
data.forEach(function (item) {
var d = item.selected.origin.data;
r += d[priceName];
});
}
var fr = 0;
if (itemTcode === '70') {
if (getData.ratioAmountDcode === '10' || getData.ratioAmountDcode === '20') {
if (getData.ratioAmountDcode === '10') {
fr = Math.round(r * (getData.ratioAmountValue / 100) / 10) * 10;
} else {
fr = getData.ratioAmountValue;
}
}
}
return (min * r) - (min * fr);
})();
var dataItemName = (function () {
var a = [];
data.forEach(function (item) {
var selected = item.selected;
var origin = selected.origin;
var itemNo = origin.itemNo;
var getData = _this.product.bundle.getData(itemNo);
var r = {};
if (isJewelry) {
var selectedItem = origin.data.selectedItem;
r['item_name'] = selectedItem.itemName;
r['brand_name'] = selectedItem.brandName;
r['uitem_name'] = origin.data.title;
} else {
r['item_name'] = getData.itemName;
r['brand_name'] = getData.brandName;
r['uitem_name'] = origin.data.uitemName;
}
a.push(r);
});
return a;
})();
var layouts = [];
layouts.push('');
layouts.push('' + title + '
');
layouts.push('');
if (oApplyMplusNProm != null) {
layouts.push('
' + oApplyMplusNProm.benefitConditionValue + ' 개 구매시 ' + oApplyMplusNProm.benefitValue + ' 개 더 증정 (교차구매불가)
');
}
layouts.push('
수량 감소 ');
layouts.push('
수량 증가 ');
layouts.push('
');
layouts.push(' ');
layouts.push(' ');
layouts.push('
');
layouts.push('');
layouts.push('' + _this.params.getCurrency(price) + ' 원');
layouts.push('
');
layouts.push('');
layouts.push('delete ');
layouts.push(' ');
layouts.push(' ');
return layouts.join('');
},
compositionType: function (prop) {
var data = prop.data;
var idx = prop.idx + 1;
var itemCompositionGroupSn = prop.itemCompositionGroupSn;
var itemNo = data.itemNo;
var getData = _this.product.bundle.getData(itemNo);
var lowerVendNo = getData.lowerVendNo;
var imgUrl = prop.imgUrl;
var sellPrice = data.sellPrice;
var dispItemPrice = data.dispItemPrice;
var sellEndYn = data.sellEndYn;
var soldoutYn = data.soldoutYn;
var hasSoldout = soldoutYn == 'Y' || sellEndYn == 'Y';
var soldoutClass = hasSoldout ? ' class="sold_out"' : '';
var reWhsInNotificPossYn = data.reWHSInNotificPossYn;
let reWhsInLoginPromiseData = data.reWhsInLoginPromiseData;
var layouts = [];
var isJewelry = data.jwYn;
layouts.push('');
if (hasSoldout) {
layouts.push('');
} else {
layouts.push('');
}
layouts.push(' ');
return layouts.join('');
},
compositionTypes: function (props) {
var g = this;
var datas = props.datas;
var itemCompositionGroupSn = props.itemCompositionGroupSn;
var soldoutLabel = 'soldoutCompositionGroupLabel_' + itemCompositionGroupSn + '_' + _this.opts.customLabel;
let reWhsInLoginPromiseData = props.reWhsInLoginPromiseData;
var layouts = [];
layouts.push('');
layouts.push('상품
');
layouts.push('');
layouts.push('
');
layouts.push('
');
layouts.push('상품을 선택해 주세요. ');
layouts.push(' ');
layouts.push('
');
layouts.push('
');
var buildImgUrl = function (path) {
var r = null;
if (path != isUndefined) {
var s0 = path[0];
var _imgDomain = itemApis.prefix.imgPath;
var _path = path;
if (s0 == 'r') {
_imgDomain = win.hasOwnProperty('UIPage') && win.UIPage.hasOwnProperty('itemUrl') ? (win.UIPage.itemUrl + '/') : '//item.elandrs.com/';
} else {
if (s0 != '/') {
_imgDomain = _imgDomain + '/';
}
}
r = _imgDomain + _path + '?w=48';
}
return r;
};
datas.forEach(function (data, idx) {
data["reWhsInLoginPromiseData"] = reWhsInLoginPromiseData;
_this.product.bundle.compositionDatas[data.itemNo] = {
data: data
};
layouts.push(g.compositionType({
itemCompositionGroupSn: itemCompositionGroupSn,
data: data,
idx: idx,
imgUrl: buildImgUrl(data.representImagePath)
}));
});
layouts.push(' ');
layouts.push('
');
layouts.push(' ');
layouts.push('품절제외 ');
layouts.push('
');
layouts.push('
');
layouts.push('
');
layouts.push('
');
layouts.push(' ');
return layouts.join('');
},
priceList: function () {
var layouts = [];
layouts.push('');
return layouts.join('');
}
}
}
});
},
buildDelivery: function () {
var _this = this;
var message = this.opts.message;
var $basicOptionWrap = this.$basicOptionWrap;
var $selectDeliveryWrap = this.$selectDeliveryWrap;
Util.def(this, {
delivery: {
state: {
fixed: false,
complete: false
},
buildStoreLayer: function () {
Util.def(this, {
storelayer: {
opened: false,
obj: (function () {
return $('.cp-detail-pop-sel-store');
})(),
instance: null,
openLayer: function (props) {
if (this.instance == null) return;
if (!this.opened) {
this.opened = true;
this.instance.opts.openerTarget = props.openerTarget;
this.obj.trigger('openLayer');
}
},
closeLayer: function () {
if (this.instance == null) return;
if (this.opened) {
this.obj.trigger('closeLayer');
}
},
destroy: function () {
if (this.instance == null) return;
this.instance.destroy();
this.instance = null;
},
build: function () {
if (this.instance != null || !this.obj.length) return;
if (this.obj.data('CmLayer') == isUndefined) {
this.instance = new CmLayer(this.obj);
} else {
this.instance = this.obj.data('CmLayer');
}
this.instance.opts.on.layerOpenBefore = function () {
this.opened = true;
}.bind(this);
this.instance.opts.on.layerCloseBefore = function () {
if (!_this.delivery.state.complete) {
var $input = _this.delivery.getStoreOpener();
$input.removeAttr('checked').prop('checked', false);
}
_this.delivery.state.complete = false;
_this.product.toolbar.sync({
data: _this.$optionSection.html()
});
}.bind(this);
this.instance.opts.on.layerCloseAfter = function () {
this.opened = false;
}.bind(this);
}
}
});
this.storelayer.build();
},
getStoreOpener: function () {
var $el = $selectDeliveryWrap.find('input[data-id="delivery2"]');
return $el.length ? $el : null;
},
checkedDelivery: function () {
var r = null;
var $inputs = $selectDeliveryWrap.find('input');
var $checkInput = $inputs.filter(function () {
return $(this).prop('checked');
}).eq(0);
if ($checkInput.length && ($checkInput.attr('data-push-type') != 'layer')) {
r = {
id: $checkInput.attr('id'),
text: $checkInput.next().text()
};
}
return r;
},
able: function (props) {
var deferred = $.Deferred();
var deliveryChecked = this.checkedDelivery();
if (deliveryChecked != null) {
deferred.resolve(deliveryChecked);
} else {
this.state.complete = false;
}
return deferred.promise();
},
changeFunc: function (e) {
var $t = $(e.currentTarget);
var $inputs = $selectDeliveryWrap.find('input');
$inputs.not($t).removeAttr('checked').prop('checked', false);
$t.attr('checked', 'checked').prop('checked', true);
var deliveryChecked = this.checkedDelivery();
if (deliveryChecked != null) {
var params = _this.params;
if (_this.product.state == 'alone') {
var $itemList = $basicOptionWrap.find('> ul');
var getItemDatas = params.getItemDatas($itemList);
var selectedNames = getItemDatas.selectedNames;
var $willLoadElement = getItemDatas.willLoadElement;
if ($willLoadElement == null) {
if ((selectedNames != null) && (selectedNames.indexOf(message.inputTxt) == -1)) {
_this.product.complete(deliveryChecked);
} else if (selectedNames == null) {
_this.product.onlyDelivery(deliveryChecked);
}
}
} else {
_this.product.complete(deliveryChecked);
}
} else {
this.storelayer.openLayer({
openerTarget: this.getStoreOpener()
});
}
_this.product.toolbar.sync({
data: _this.$optionSection.html()
});
},
bindEvents: function () {
$selectDeliveryWrap.on(_this.changeEvents('change'), 'input', this.changeFunc.bind(this));
},
reset: function () {
if (this.state.fixed) return;
this.state.complete = false;
var $inputs = $selectDeliveryWrap.find('input');
$inputs.removeAttr('checked').prop('checked', false);
},
init: function () {
// this.reset();
var $inputs = $selectDeliveryWrap.find('input');
if (($inputs.length == 1) && ($inputs.prop('checked') == true)) {
this.state.fixed = true;
}
this.buildStoreLayer();
this.bindEvents();
}
}
});
this.delivery.init();
},
buildCalendar: function () {
var _this = this;
Util.def(this, {
calendar: {
$el: $('#CmCalendar'),
instance: null,
orderNum: 0,
itemLength: 0,
data: [],
oData: {},
aData: [],
$target: null,
hasChange: false,
reset: function () {
if (this.instance == null) return;
if (this.orderNum != 0) {
this.data = [];
this.oData = {};
this.aData = [];
this.hasChange = false;
}
this.$inputEl.val('');
},
open: function (props) {
if (this.instance == null) return;
this.$target = props.$target;
var aData = this.aData;
var oData = this.oData;
this.data.forEach(function (prop) {
var itemOptionName = prop.data.itemOptionName;
aData.push(itemOptionName);
oData[itemOptionName] = prop.data;
});
this.instance.datepicker.opts.isInvalidDate = function (date) {
var df = date.format('YYYY-MM-DD');
if (aData.indexOf(df) == -1) {
return true;
}
};
if (aData.length) {
aData.sort();
this.$cdWrap.attr({
'data-mindate': aData[0],
'data-maxdate': aData[aData.length - 1]
});
}
this.$el.trigger('openLayer');
},
hideCmCalendar: function () {
if (this.instance == null) return;
this.$cdWrap.removeAttr('data-mindate data-maxdate');
this.$cdWrap.removeData('mindate maxdate');
win.setTimeout(function () {
if (!this.hasChange) {
this.$inputEl.val('');
}
}.bind(this), 0);
},
showCmCalendar: function () {
if (this.instance == null) return;
if (this.orderNum != (this.itemLength -1)) return;
var oData = this.oData;
var dateRangePicker = this.instance.datepicker.instance.datepicker.instance;
var $container = dateRangePicker.container;
var $leftContainer = $container.find('.left');
var leftCalendar = dateRangePicker.leftCalendar;
leftCalendar.calendar.forEach(function (rc, rIdx) {
var r = rIdx;
rc.forEach(function (lc, cIdx) {
var c = cIdx;
var df = lc.format('YYYY-MM-DD');
if (oData.hasOwnProperty(df)) {
var title = 'r' + r + 'c' + c;
var sellPrice = oData[df].sellPrice;
var $el = $leftContainer.find('[data-title="' + title + '"]');
$el.append('' + _this.params.getCurrency(sellPrice) + ' ');
}
});
});
},
changeCmCalendar: function (e, date) {
this.hasChange = true;
_this.methods.calendarCheck(date);
},
build: function () {
if (this.instance != null || !this.$el.length) return;
if (this.$el.data('CmCalendar') == isUndefined) return;
this.instance = this.$el.data('CmCalendar');
this.$cdWrap = this.$el.find('[data-calendarlayer__wrap]');
this.$inputEl = this.$cdWrap.find('input[type="text"]');
this.$el.on('hideCmCalendar.cmcalendar', this.hideCmCalendar.bind(this));
this.$el.on('showCmCalendar.cmcalendar', this.showCmCalendar.bind(this));
this.$el.on('changeCmCalendar.cmcalendar', this.changeCmCalendar.bind(this));
if ((_this.$el.data('CmLayer') != isUndefined) && (_this.$el.attr('data-cp') == 'PrdPop')) {
_this.$el.on(_this.changeEvents('layerCloseBefore'), function () {
this.$el.off('hideCmCalendar.cmcalendar');
this.$el.off('showCmCalendar.cmcalendar');
this.$el.off('changeCmCalendar.cmcalendar');
}.bind(this));
}
}
}
});
this.calendar.build();
},
buildProduct: function () {
var _this = this;
var $basicOptionWrap = this.$basicOptionWrap;
var $basicGiftWrap = this.$basicGiftWrap;
var $selectDeliveryWrap = this.$selectDeliveryWrap;
var $selectOptionWrap = this.$selectOptionWrap;
var $priceOptionWrap = this.$priceOptionWrap;
var message = this.opts.message;
Util.def(this, {
product: {
state: null,
destroy: function () {
var state = this.state;
this.toolbar.destroy();
if (state != null) {
this[state].prices.destroy();
}
},
toolbar: {
opts: {
toggleBtn: '[data-toggle-active]',
toggleList: '[data-toggle-list]',
classAttr: {
active: 'active',
disabled: 'disabled'
},
resizeStart: null
},
destroy: function () {
if (!_this.opts.toolbarSync) return;
this.bindEvents(false);
},
init: function () {
if (!_this.opts.toolbarSync) return;
this.setElements();
this.buildFocusItem();
this.resizeFunc();
this.bindEvents(true);
},
setElements: function () {
this.$el = $('.cp-detail-cta');
this.$optWrap = this.$el.find('.on_opt_box');
this.$optControlWrap = this.$el.find('.opt_on_off_area');
this.$optionSection = this.$el.find('.detail-option-section');
this.$totalPrice = this.$el.find('[data-option-totalprice]');
},
buildFocusItem: function () {
var _this = this;
var classAttr = this.opts.classAttr;
var $optionSection = this.$optionSection;
Util.def(this, {
focustoggle: {
destroy: function () {
var childs = $optionSection.find(_this.opts.toggleBtn);
for (var i = 0, max = childs.length; i < max; i++) {
var child = childs.eq(i);
this.leave(child.parent(_this.opts.toggleList));
}
},
leave: function (el) {
if (!AllLayer.stateAttr.opened) {
el.removeClass(classAttr.active);
el.off('focusoutside mousedownoutside');
el.removeData('outsideEvent');
}
},
setHeight: function (el) {
var $wrap = _this.$optWrap;
if ($wrap.length) {
var $wrapOffsetTop = $wrap.offset().top;
var $wrapHeight = Util.getBoundingClientRect($wrap[0]).height;
var $elOffsetTop = el.offset().top;
var $elHeight = Util.getBoundingClientRect(el[0]).height;
var _limitOffset = $wrapOffsetTop + $wrapHeight;
var _targetOffset = $elOffsetTop + $elHeight;
var $scrollEl = el.find('[data-optionview-list]');
var $scrollSiblings = $scrollEl.siblings();
var _siblingsHeight = (function () {
var r = 0;
for (var i = 0, max = $scrollSiblings.length; i < max; i++) {
var $sibling = $scrollSiblings.eq(i);
var _siblingHeight = $sibling.outerHeight(true);
r += _siblingHeight;
}
return r;
})();
var borderWidth = 2;
if ($scrollEl.length) {
$scrollEl.css('max-height', _limitOffset - _targetOffset - _siblingsHeight - borderWidth);
}
}
},
enter: function (el) {
var f = this;
if (el.data('outsideEvent') == isUndefined) {
el.data('outsideEvent', 'true');
this.setHeight(el);
el.addClass(classAttr.active);
el.on('focusoutside mousedownoutside', function (e) {
var ot = $(e.currentTarget);
f.leave(ot);
});
}
},
scrollFocus: function (el) {
var $optionList = el.find('[data-optionview-list]');
var $focusEl = $optionList.children('.focused');
if ($focusEl.length) {
$optionList.scrollTop(0);
var to = $focusEl.offset().top - $optionList.offset().top;
$optionList.scrollTop(to);
}
},
click: function (el) {
var child = el.parent(_this.opts.toggleList);
if (child.hasClass(classAttr.disabled)) return;
if (child.data('outsideEvent') == isUndefined) {
this.enter(child);
this.scrollFocus(child);
} else {
this.leave(child);
}
}
}
});
},
toggleFunc: function (e) {
e.preventDefault();
var target = $(e.currentTarget);
this.focustoggle.click(target);
},
bindEvents: function (type) {
if (!this.$optionSection.length) return;
var $optionSection = this.$optionSection;
if (type) {
$(win).on(_this.changeEvents('resize orientationchange'), this.resizeFunc.bind(this));
$optionSection.on(_this.changeEvents('click'), this.opts.toggleBtn, this.toggleFunc.bind(this));
$optionSection.on(_this.changeEvents('click'), '[data-optionitem] [data-calendar-active]', function (e) {
e.preventDefault();
if (_this.loader.options.state) return;
var $t = $(e.currentTarget);
var $inputNo = $t.closest('[data-itemoptiontype_inputno]');
var $itemNo = $t.closest('[data-item_no]');
var inputNo = $inputNo.attr('data-itemoptiontype_inputno');
var itemNo = $itemNo.attr('data-item_no');
var selectorStr = '[data-item_no="' + itemNo + '"] [data-itemoptiontype_inputno="' + inputNo + '"]';
var $activeEl = _this.$optionSection.find(selectorStr);
var $parentList = $activeEl.find('[data-toggle-list]');
var $toggleActive = $parentList.find('>[data-calendar-active]');
$toggleActive.trigger('click');
});
$optionSection.on(_this.changeEvents('click'), '[data-optionitem] [data-optionview-list] a', function (e) {
e.preventDefault();
if (_this.loader.options.state) return;
var $t = $(e.currentTarget);
var $optionNo = $t.closest('[data-option_no]');
if ($optionNo.hasClass('sold_out')) return;
var $inputNo = $t.closest('[data-itemoptiontype_inputno]');
var $itemNo = $t.closest('[data-item_no]');
var $compositionIdx = $t.closest('[data-composition_idx]');
var optionNo = $optionNo.attr('data-option_no');
var inputNo = $inputNo.attr('data-itemoptiontype_inputno');
var itemNo = $itemNo.attr('data-item_no');
var selectorStr = '[data-item_no="' + itemNo + '"] [data-itemoptiontype_inputno="' + inputNo + '"] [data-option_no="' + optionNo + '"]';
if ($compositionIdx.length) {
var compositionIdx = $compositionIdx.attr('data-composition_idx');
selectorStr = '[data-composition_idx="' + compositionIdx + '"] ' + selectorStr;
}
var $activeEl = _this.$optionSection.find(selectorStr);
var $parentList = $t.closest('[data-toggle-list]');
var $toggleActive = $parentList.find('>[data-toggle-active]');
$toggleActive.trigger('click');
$activeEl.find('a').trigger('click');
});
$optionSection.on(_this.changeEvents('click'), '[data-compositionitem] [data-optionview-list] a', function (e) {
e.preventDefault();
if (_this.loader.options.state) return;
var $t = $(e.currentTarget);
var $optionNo = $t.closest('[data-compositionitem_no]');
if ($optionNo.hasClass('sold_out')) return;
var $itemNo = $t.closest('[data-item_no]');
var $compositionIdx = $t.closest('[data-composition_idx]');
var optionNo = $optionNo.attr('data-compositionitem_no');
var itemNo = $itemNo.attr('data-item_no');
var compositionIdx = $compositionIdx.attr('data-composition_idx');
var selectorStr = '[data-composition_idx="' + compositionIdx + '"] [data-item_no="' + itemNo + '"] [data-compositionitem_no="' + optionNo + '"]';
var $activeEl = _this.$optionSection.find(selectorStr);
var $parentList = $t.closest('[data-toggle-list]');
var $toggleActive = $parentList.find('>[data-toggle-active]');
$toggleActive.trigger('click');
$activeEl.find('a').trigger('click');
});
$optionSection.on(_this.changeEvents('click'), '[data-giftitem] [data-optionview-list] a', function (e) {
e.preventDefault();
if (_this.loader.options.state) return;
var $t = $(e.currentTarget);
var $optionNo = $t.closest('[data-uitem_no]');
if ($optionNo.hasClass('sold_out')) return;
var $itemNo = $t.closest('[data-item_no]');
var optionNo = $optionNo.attr('data-uitem_no');
var itemNo = $itemNo.attr('data-item_no');
var selectorStr = '[data-item_no="' + itemNo + '"] [data-uitem_no="' + optionNo + '"]';
var $activeEl = _this.$basicGiftWrap.find(selectorStr);
var $parentList = $t.closest('[data-toggle-list]');
var $toggleActive = $parentList.find('>[data-toggle-active]');
$toggleActive.trigger('click');
$activeEl.find('a').trigger('click');
});
$optionSection.on(_this.changeEvents('change'), '[data-priceitem] [data-pricesize]', function (e) {
var $el = $(e.currentTarget);
var $child = $el.closest('[data-priceitem]');
var idx = $child.attr('data-price-idx');
var current = parseFloat($.trim($el.val()));
var $activeEl = $selectOptionWrap.find('[data-priceitem][data-price-idx="' + idx + '"] [data-pricesize]');
$activeEl.val(current);
$activeEl.attr('value', current);
$activeEl.trigger('change');
});
$optionSection.on(_this.changeEvents('click'), '[data-priceitem] [data-pricesize-minus]', function (e) {
e.preventDefault();
var $el = $(e.currentTarget);
var $child = $el.closest('[data-priceitem]');
var idx = $child.attr('data-price-idx');
var $activeEl = $selectOptionWrap.find('[data-priceitem][data-price-idx="' + idx + '"] [data-pricesize-minus]');
$activeEl.trigger('click');
});
$optionSection.on(_this.changeEvents('click'), '[data-priceitem] [data-pricesize-plus]', function (e) {
e.preventDefault();
var $el = $(e.currentTarget);
var $child = $el.closest('[data-priceitem]');
var idx = $child.attr('data-price-idx');
var $activeEl = $selectOptionWrap.find('[data-priceitem][data-price-idx="' + idx + '"] [data-pricesize-plus]');
$activeEl.trigger('click');
});
$optionSection.on(_this.changeEvents('click'), '[data-priceitem] [data-price-del]', function (e) {
e.preventDefault();
var $el = $(e.currentTarget);
var $child = $el.closest('[data-priceitem]');
var idx = $child.attr('data-price-idx');
var $activeEl = $selectOptionWrap.find('[data-priceitem][data-price-idx="' + idx + '"] [data-price-del]');
$activeEl.trigger('click');
});
$optionSection.on(_this.changeEvents('change'), '[data-optionsoldout-check]', function (e) {
var $el = $(e.currentTarget);
var checked = $el.prop('checked');
var $target = $el.closest('[data-options-flex]');
var $targetList = $target.find('[data-optionview-list]');
var $targetChilds = $targetList.find('>.sold_out');
if (checked) {
$targetChilds.hide();
} else {
$targetChilds.css('display', '');
}
var basicId = $el.attr('data-basic-id');
var $activeEl = _this.$optionSection.find('input#' + basicId + '');
var $activeFlex = $activeEl.closest('[data-options-flex]');
var $activeFlexList = $activeFlex.find('[data-optionview-list]');
var $activeFlexChilds = $activeFlexList.find('>.sold_out');
$activeEl.prop('checked', checked);
if (checked) {
$activeEl.attr('checked', '');
$activeFlexChilds.hide();
} else {
$activeEl.removeAttr('checked');
$activeFlexChilds.css('display', '');
}
});
$optionSection.on(_this.changeEvents('change'), '[data-jw-text]', function (e) {
var $el = $(e.currentTarget);
var $child = $el.closest('[data-optionitem]');
var jwName = $child.attr('data-itemoptiontype_name');
var $activeEl = $basicOptionWrap.find('[data-optionitem][data-itemoptiontype_name="' + jwName + '"]');
$activeEl.find('[data-jw-text]').val($el.val());
$activeEl.find('[data-jw-text]').attr('value', $el.val());
});
$optionSection.on(_this.changeEvents('click'), '[data-jw-push]', function (e) {
e.preventDefault();
var $el = $(e.currentTarget);
var $child = $el.closest('[data-optionitem]');
var jwName = $child.attr('data-itemoptiontype_name');
var $activeEl = $basicOptionWrap.find('[data-optionitem][data-itemoptiontype_name="' + jwName + '"]');
$activeEl.find('[data-jw-push]').trigger('click');
win.setTimeout(function () {
$child.find('[data-jw-text]').focus();
}, 10);
});
$optionSection.on(_this.changeEvents('change'), '[data-delivery-selectwrap] input', function (e) {
var $el = $(e.currentTarget);
var $child = $el.closest('li');
var idx = $child.index();
var $activeEl = $selectDeliveryWrap.find('.delivery_type li').eq(idx).find('input');
$activeEl.trigger('change');
});
$optionSection.on(_this.changeEvents('click'), '[data-marketchoice-btn]', function (e) {
e.preventDefault();
_this.$optionSection.find('[data-marketchoice-btn]').trigger('click');
});
} else {
$(win).off(_this.changeEvents('resize orientationchange'));
$optionSection.off(_this.changeEvents('click'));
$optionSection.off(_this.changeEvents('change'));
}
},
resizeFunc: function () {
this.winWidth = Util.winSize().w;
if (this.opts.resizeStart == null) {
this.opts.resizeStart = this.winWidth;
this.resizeAnimateFunc();
}
win.clearTimeout(this.resizeEndTime);
this.resizeEndTime = win.setTimeout(this.resizeEndFunc.bind(this), 50);
},
resizeEndFunc: function () {
this.opts.resizeStart = null;
this.resizeAct();
Util.cancelAFrame.call(win, this.resizeRequestFrame);
},
resizeAnimateFunc: function () {
// this.resizeAct();
this.resizeRequestFrame = Util.requestAFrame.call(win, this.resizeAnimateFunc.bind(this));
},
resizeAct: function () {
var $wrap = this.$optWrap;
var $controlWrap = this.$optControlWrap;
var controlProps = (function () {
return {
top: $controlWrap.length ? $controlWrap.offset().top : 0,
height: $controlWrap.length ? $controlWrap.outerHeight(true) : 0
}
})();
var winHeight = Util.winSize().h;
var scrollTop = $(win).scrollTop();
var space = (scrollTop + winHeight) - (controlProps.top + controlProps.height);
if ($wrap.length) {
$wrap.css('max-height', winHeight - space - controlProps.height);
}
},
sync: function (props) {
if (!_this.opts.toolbarSync) return;
var $optionSection = this.$optionSection;
if (!$optionSection.length) return;
var data = props.data;
var $html = $(data);
var optionSelectwrapScroll = $optionSection.find('[data-option-selectwrap]').scrollTop();
this.setLayout($html);
$optionSection.empty().html($html);
var $optionsSelectWrap = $optionSection.find('[data-option-selectwrap]');
$optionsSelectWrap.css('display', '');
if (optionSelectwrapScroll != null) {
$optionsSelectWrap.scrollTop(optionSelectwrapScroll);
}
if (props.hasOwnProperty('totalPrice')) {
this.$totalPrice.text(props.totalPrice);
}
$optionSection.find('.custom-loader').remove();
$optionSection.find('[data-chip-el]').remove();
},
setLayout: function ($wrap) {
var $x = $('').append($wrap);
var $soldoutWrap = $x.find('.option_list .chk_sld');
var $soloutInputs = $soldoutWrap.find('input');
for (var i = 0, max = $soloutInputs.length; i < max; i++) {
(function (idx) {
var $soloutInput = $soloutInputs.eq(idx);
var attrName = $soloutInput.attr('name');
var getIdName = $soloutInput.attr('id');
var setIdName = 'Toolbar' + getIdName;
$soloutInput.attr('data-basic-id', getIdName);
$soloutInput.attr('name', 'Toolbar' + attrName);
$soldoutWrap.find('input[id="' + getIdName + '"]').attr('id', setIdName);
$soldoutWrap.find('label[for="' + getIdName + '"]').attr('for', setIdName);
})(i);
}
var $deliveryWrap = $x.find('[data-delivery-selectwrap]');
var $deliveryInputs = $deliveryWrap.find('input');
for (var i = 0, max = $deliveryInputs.length; i < max; i++) {
(function (idx) {
var $deliveryInput = $deliveryInputs.eq(idx);
var attrName = $deliveryInput.attr('name');
var getIdName = $deliveryInput.attr('id');
var setIdName = 'Toolbar' + getIdName;
$deliveryInput.attr('data-basic-id', getIdName);
$deliveryInput.attr('name', 'Toolbar' + attrName);
$deliveryWrap.find('input[id="' + getIdName + '"]').attr('id', setIdName);
$deliveryWrap.find('label[for="' + getIdName + '"]').attr('for', setIdName);
})(i);
}
},
initialize: function () {
if (!_this.opts.toolbarSync) return;
this.$totalPrice.text(0);
}
},
onlyDelivery: function (deliveryProp) {
var state = this.state;
var prices = this[state].prices;
prices.onlyDelivery({
delivery: deliveryProp
});
},
complete: function (deliveryProp) {
var state = this.state;
var prices = this[state].prices;
prices.allAddDone({
delivery: deliveryProp
});
},
alone: {
prices: {
selectDatas: [],
isSelected: function (props) {
var selectDatas = this.selectDatas;
var sameValue = false;
selectDatas.forEach(function (data) {
if (data != null) {
if (JSON.stringify(data.key) == JSON.stringify(props)) {
sameValue = true;
}
}
});
return sameValue;
},
change: function (e) {
if (_this.loader.options.state) return;
var $el = $(e.currentTarget);
var $child = $el.closest('[data-priceitem]');
var idx = $child.attr('data-price-idx');
var selectDataSave = this.selectDatas[idx].save;
var oncePurchasePossMaxQty = selectDataSave.oncePurchasePossMaxQty;
var onepPurchasePossMaxQty = selectDataSave.onepPurchasePossMaxQty;
var sellPossQty = selectDataSave.sellPossQty;
var aMin = [];
if (typeof oncePurchasePossMaxQty == 'number') {
aMin.push(oncePurchasePossMaxQty);
}
if (typeof onepPurchasePossMaxQty == 'number') {
aMin.push(onepPurchasePossMaxQty);
}
if (typeof sellPossQty == 'number') {
aMin.push(sellPossQty);
}
var minVal = Math.min.apply(null, aMin);
var current = $.trim($el.val());
if (isNaN(current)) {
current = 1;
}
selectDataSave.current = current;
if (selectDataSave.current < selectDataSave.min) {
selectDataSave.current = selectDataSave.min;
} else if (selectDataSave.current > minVal) {
selectDataSave.current = minVal;
}
this.pushData($el);
},
minus: function (e) {
e.preventDefault();
if (_this.loader.options.state) return;
var $el = $(e.currentTarget);
var $child = $el.closest('[data-priceitem]');
var idx = $child.attr('data-price-idx');
var selectDataSave = this.selectDatas[idx].save;
selectDataSave.current--;
if (selectDataSave.current < selectDataSave.min) {
selectDataSave.current = selectDataSave.min;
win.alert(message.uitemMin.replace('{{N}}', selectDataSave.min));
}
this.pushData($el);
},
plus: function (e) {
e.preventDefault();
if (_this.loader.options.state) return;
var $el = $(e.currentTarget);
var $child = $el.closest('[data-priceitem]');
var idx = $child.attr('data-price-idx');
var selectDataSave = this.selectDatas[idx].save;
var oncePurchasePossMaxQty = selectDataSave.oncePurchasePossMaxQty;
var onepPurchasePossMaxQty = selectDataSave.onepPurchasePossMaxQty;
var sellPossQty = selectDataSave.sellPossQty;
var aMin = [];
if (typeof oncePurchasePossMaxQty == 'number') {
aMin.push(oncePurchasePossMaxQty);
}
if (typeof onepPurchasePossMaxQty == 'number') {
aMin.push(onepPurchasePossMaxQty);
}
if (typeof sellPossQty == 'number') {
aMin.push(sellPossQty);
}
var minVal = Math.min.apply(null, aMin);
selectDataSave.current++;
if (selectDataSave.current > minVal) {
selectDataSave.current = minVal;
win.alert(message.uitemMax.replace('{{N}}', minVal));
}
this.pushData($el);
},
del: function (e) {
e.preventDefault();
if (_this.loader.options.state) return;
var $el = $(e.currentTarget);
var $child = $el.closest('[data-priceitem]');
var idx = $child.attr('data-price-idx');
this.selectDatas[idx] = null;
$child.remove();
this.totalPrice();
},
pushData: function ($el) {
var $child = $el.closest('[data-priceitem]');
var $priceSize = $child.find('[data-pricesize]');
var $priceText = $child.find('[data-price-text]');
var idx = $child.attr('data-price-idx');
var selectDataSave = this.selectDatas[idx].save;
var current = selectDataSave.current;
$priceSize.val(selectDataSave.current);
$priceSize.attr('value', selectDataSave.current);
var itemPrice = null;
if (_this.jewelry) {
itemPrice = current * selectDataSave.price;
} else {
itemPrice = current * selectDataSave.dispItemPrice;
}
$priceText.text(_this.params.getCurrency(itemPrice));
$child.attr('data-itemprice', itemPrice);
this.totalPrice();
},
totalPrice: function () {
var selectDatas = this.selectDatas;
var $childs = $selectOptionWrap.find('[data-priceitem]');
var r = 0;
if (_this.jewelry) {
var calculateType = $priceOptionWrap.attr('data-calculate-type') == isUndefined ? 'price' : $priceOptionWrap.attr('data-calculate-type');
} else {
var calculateType = $priceOptionWrap.attr('data-calculate-type') == isUndefined ? 'dispItemPrice' : $priceOptionWrap.attr('data-calculate-type');
}
var build = function (data) {
if (data != null) {
var save = data.save;
r += save.current * save[calculateType];
}
};
selectDatas.forEach(function (data) {
build(data);
});
$priceOptionWrap.find('[data-option-totalprice]').text(_this.params.getCurrency(r));
if ($childs.length) {
$priceOptionWrap.css('display', '');
} else {
$selectOptionWrap.hide();
$priceOptionWrap.hide();
}
_this.product.toolbar.sync({
data: _this.$optionSection.html(),
totalPrice: _this.params.getCurrency(r)
});
},
aloneDatas: {
able: null,
add: null,
set: function (prop) {
this.able = Util.def({}, prop);
this.add = Util.def({}, prop);
},
reset: function () {
this.able = null;
this.add = null;
}
},
onlyDelivery: function (props) {
_this.delivery.state.complete = true;
this.add(Util.def({
itemNo: _this.opts.itemNo,
}, {
delivery: props.delivery
}));
},
allAddDone: function (props) {
if (this.aloneDatas.add != null) {
_this.delivery.state.complete = true;
this.add(Util.def({}, this.aloneDatas.add, {
delivery: props.delivery
}));
} else {
_this.delivery.state.complete = false;
}
},
getSelectedOptionInfos: function ($itemList) {
if ($itemList === undefined || $itemList === null) {
return [];
}
let selectedOptionInfos = [];
try {
$itemList.children("li").each(function () {
const $this_ = $(this);
const itemoptiontype_name = $this_.data("itemoptiontype_name");
if (itemoptiontype_name === '색상' || itemoptiontype_name === '사이즈') {
const itemoption_no = $this_.attr("data-selected-value");
const $span_ = $this_[0].children[1].children[0].children[0].children[0];
const selected_name = $span_.textContent;
let selectedOption = {};
selectedOption["optionNo"] = itemoption_no;
selectedOption["optionType"] = itemoptiontype_name;
selectedOption["optionValue"] = selected_name;
selectedOptionInfos.push(selectedOption);
}
});
} catch (error) {
selectedOptionInfos = [];
}
return selectedOptionInfos;
},
jwAdd: function (props) {
var done = function () {
var itemNo = props.itemNo;
var $itemList = props.$itemList;
var params = _this.params;
var getData = params.getData(itemNo);
var lowerVendNo = props.lowerVendNo;
let selectedOptionInfos = this.getSelectedOptionInfos($itemList);
var jwData = {};
var addDone = function (origin) {
var itemOpts = Util.def({}, props, {
data: origin
});
var cartProps = {
itemNo: itemOpts.itemNo,
prodCode: itemOpts.data.ProdCode,
lowerVendNo: lowerVendNo,
selectedOptionInfos: selectedOptionInfos,
isJewelry: _this.jewelry
};
var priceProps = {
norPrice: itemOpts.data.NorPrice,
price: itemOpts.data.Price,
saleDcRate: itemOpts.data.SaleDCRate
};
if (getData.itemGiftApplyYn == 'Y' && itemOpts.hasOwnProperty('gift')) {
cartProps['sitemItemNo'] = itemOpts.gift.itemNo;
cartProps['sitemUitemNo'] = itemOpts.gift.uitemNo;
cartProps['sitemLowerVendNo'] = itemOpts.gift.lowerVendNo;
} else {
cartProps['sitemItemNo'] = null;
cartProps['sitemUitemNo'] = null;
cartProps['sitemLowerVendNo'] = null;
}
var priceItem = _this.makehtml.get.priceItem(itemOpts);
var $priceItem = $(priceItem);
$priceItem.attr('data-price-idx', this.selectDatas.length);
$priceItem.attr('data-cartdata', JSON.stringify(cartProps));
$priceItem.attr('data-jwdata', jwData);
var textData = params.getTextData($itemList);
if (textData != null) {
$priceItem.attr('data-textdata', JSON.stringify(textData));
}
$priceItem.attr('data-pricedata', JSON.stringify(priceProps));
$priceItem.attr('data-deliverydata', JSON.stringify(props.delivery));
$selectOptionWrap.find('ul').prepend($priceItem);
$selectOptionWrap.css('display', '');
this.selectDatas.push({
key: {
itemNo: itemNo,
brandCode: getData.brandCode,
styleCode: getData.modelNo,
selectedValues: selectedValues,
selectedNames: selectedNames
},
save: {
oncePurchasePossMaxQty: getData.oncePurchasePossMaxQty,
onepPurchasePossMaxQty: getData.onepPurchasePossMaxQty,
sellPossQty: origin.sellPossQty,
min: 1,
current: 1,
norPrice: origin.NorPrice,
price: origin.Price
}
});
this.totalPrice();
_this.outCallback('selected');
}.bind(this);
var dataOpts = {};
dataOpts['BrandCode'] = getData.brandCode;
dataOpts['StyleCode'] = getData.modelNo;
var ajaxCall = function (props) {
_this.loader.options.run();
jwData = JSON.stringify(props.data);
var cb = props != isUndefined && props.hasOwnProperty('complete') ? props.complete : function () {};
$.ajax({
type: 'POST',
dataType: 'json',
contentType: 'application/json',
url: itemApis.prefix.jwUitemApi,
data: jwData,
headers: {
'Authorization': 'ZWxtOmdldHByaWNlMjAyMQ=='
},
complete: function () {
_this.loader.options.finish();
cb();
}
}).done(function (response) {
var aResponse = response;
if (aResponse.resultCode == 200) {
if (aResponse.data.ResultCode == 200) {
var origin = aResponse.data['Content'];
if (origin != null) {
addDone(origin);
}
} else {
win.alert(aResponse.data.Message[1]);
}
}
});
};
if (!getData.itemOptionType.length) {
ajaxCall({
data: dataOpts
});
} else {
var getItemDatas = params.getItemDatas($itemList);
var selectedValues = getItemDatas.selectedValues;
var selectedNames = getItemDatas.selectedNames;
var isSelected = this.isSelected({
itemNo: itemNo,
brandCode: getData.brandCode,
styleCode: getData.modelNo,
selectedValues: selectedValues,
selectedNames: selectedNames
});
if (isSelected) {
win.alert('이미 추가된 옵션입니다. 수량 조절은 아래 선택사항에서 해주십시오.');
_this.product.alone.gift.reset(props);
} else {
dataOpts['OptionCode'] = selectedValues;
ajaxCall({
data: dataOpts,
complete: function () {
_this.product.alone.reset(props);
}
});
this.aloneDatas.reset();
}
}
}.bind(this);
if (props.hasOwnProperty('delivery')) {
done();
} else {
this.aloneDatas.set(props);
_this.delivery.able(props).done(function (deliveryProp) {
Util.def(props, {
delivery: deliveryProp
});
done();
}.bind(this));
}
},
add: function (props) {
_this.delivery.storelayer.closeLayer();
if (_this.jewelry) {
this.jwAdd(props);
return;
}
var done = function () {
var onlyPrice = props.hasOwnProperty('onlyPrice') ? props.onlyPrice : false;
var itemNo = props.itemNo;
var $itemList = props.$itemList;
var params = _this.params;
var getData = params.getData(itemNo);
var lowerVendNo = props.lowerVendNo;
let selectedOptionInfos = this.getSelectedOptionInfos($itemList);
var addDone = function (origin) {
var itemOpts = Util.def({}, props, {
data: origin,
onlyPrice: onlyPrice,
selectedItem: getData
});
var cartProps = {
itemNo: itemOpts.itemNo,
cartUitemNo: itemOpts.data.uitemNo,
lowerVendNo: lowerVendNo,
selectedOptionInfos: selectedOptionInfos,
isJewelry: _this.jewelry
};
var priceProps = {
dispItemPrice: itemOpts.data.dispItemPrice,
sellPrice: itemOpts.data.sellPrice
};
if (getData.itemGiftApplyYn == 'Y' && itemOpts.hasOwnProperty('gift')) {
cartProps['sitemItemNo'] = itemOpts.gift.itemNo;
cartProps['sitemUitemNo'] = itemOpts.gift.uitemNo;
cartProps['sitemLowerVendNo'] = itemOpts.gift.lowerVendNo;
} else {
cartProps['sitemItemNo'] = null;
cartProps['sitemUitemNo'] = null;
cartProps['sitemLowerVendNo'] = null;
}
var priceItem = _this.makehtml.get.priceItem(itemOpts);
var $priceItem = $(priceItem);
$priceItem.attr('data-price-idx', this.selectDatas.length);
$priceItem.attr('data-cartdata', JSON.stringify(cartProps));
$priceItem.attr('data-pricedata', JSON.stringify(priceProps));
$priceItem.attr('data-deliverydata', JSON.stringify(props.delivery));
$selectOptionWrap.find('ul').prepend($priceItem);
$selectOptionWrap.css('display', '');
this.selectDatas.push({
key: {
itemNo: itemNo,
lowerVendNo: lowerVendNo,
selectedValues: selectedValues
},
save: {
oncePurchasePossMaxQty: getData.oncePurchasePossMaxQty,
onepPurchasePossMaxQty: getData.onepPurchasePossMaxQty,
sellPossQty: origin.sellPossQty,
min: origin.purchasePossMiniQty,
current: origin.purchasePossMiniQty,
sellPrice: origin.sellPrice,
price: origin.sellPrice,
dispItemPrice: origin.dispItemPrice
}
});
this.totalPrice();
_this.outCallback('selected');
}.bind(this);
if (!getData.itemOptionType.length) {
lowerVendNo = getData.lowerVendNo;
var isSelected = this.isSelected({
itemNo: itemNo,
lowerVendNo: lowerVendNo
});
if (isSelected) {
win.alert('이미 추가된 옵션입니다. 수량 조절은 아래 선택사항에서 해주십시오.');
_this.product.alone.gift.reset(props);
} else {
_this.calendar.reset();
_this.loader.options.run();
itemApis.getApi({
url: itemApis.prefix.uitemApi,
data: {
itemNo: itemNo,
lowerVendNo: lowerVendNo,
immeDcBenefitValueDcode: getData.immeDcBenefitValueDcode,
immeDcBenefitValue: getData.immeDcBenefitValue,
immeDcMaxDcAmount: getData.immeDcMaxDcAmount,
maxmembersApplyYn: getData.maxmembersApplyYn
},
complete: function () {
_this.loader.options.finish();
_this.delivery.reset();
}
}).done(function (response) {
var aResponse = response;
if (aResponse.resultCode == 200) {
var origin = aResponse.data;
addDone(origin);
}
});
}
} else {
var getItemDatas = params.getItemDatas($itemList);
var selectedValues = getItemDatas.selectedValues;
var isSelected = this.isSelected({
itemNo: itemNo,
lowerVendNo: lowerVendNo,
selectedValues: selectedValues
});
if (isSelected) {
win.alert('이미 추가된 옵션입니다. 수량 조절은 아래 선택사항에서 해주십시오.');
_this.product.alone.gift.reset(props);
} else {
_this.calendar.reset();
_this.loader.options.run();
itemApis.getApi({
url: itemApis.prefix.uitemApi,
data: {
itemNo: itemNo,
lowerVendNo: lowerVendNo,
itemOptionNoList: selectedValues,
immeDcBenefitValueDcode: getData.immeDcBenefitValueDcode,
immeDcBenefitValue: getData.immeDcBenefitValue,
immeDcMaxDcAmount: getData.immeDcMaxDcAmount,
maxmembersApplyYn: getData.maxmembersApplyYn
},
complete: function () {
_this.loader.options.finish();
_this.product.alone.reset(props);
}
}).done(function (response) {
var aResponse = response;
if (aResponse.resultCode == 200) {
var origin = aResponse.data;
addDone(origin);
}
});
this.aloneDatas.reset();
}
}
}.bind(this);
if (props.hasOwnProperty('delivery')) {
done();
} else {
this.aloneDatas.set(props);
_this.delivery.able(props).done(function (deliveryProp) {
Util.def(props, {
delivery: deliveryProp
});
done();
}.bind(this));
}
},
bindEvents: function (type) {
if (type) {
$selectOptionWrap.on(_this.changeEvents('change'), '[data-priceitem] [data-pricesize]', this.change.bind(this));
$selectOptionWrap.on(_this.changeEvents('click'), '[data-priceitem] [data-pricesize-minus]', this.minus.bind(this));
$selectOptionWrap.on(_this.changeEvents('click'), '[data-priceitem] [data-pricesize-plus]', this.plus.bind(this));
$selectOptionWrap.on(_this.changeEvents('click'), '[data-priceitem] [data-price-del]', this.del.bind(this));
} else {
$selectOptionWrap.off(_this.changeEvents('change'));
$selectOptionWrap.off(_this.changeEvents('click'));
}
},
destroy: function () {
this.aloneDatas.reset();
this.bindEvents(false);
},
init: function () {
var priceList = _this.makehtml.get.priceList();
var $priceList = $(priceList);
$selectOptionWrap.append($priceList);
this.bindEvents(true);
},
initialize: function () {
this.destroy();
this.init();
}
},
gift: {
state: {
soldout: false
},
reset: function (props) {
this.disable(props);
},
run: function (props) {
_this.product.alone.prices.add(Util.def(props, {
$itemList: $basicOptionWrap.find('[data-item_no]')
}));
},
disable: function (props) {
var itemNo = props.itemNo;
var params = _this.params;
var getData = params.getData(itemNo);
if ((getData.itemGiftApplyYn == 'Y') && !this.state.soldout) {
var $toggleList = $basicGiftWrap.find('[data-toggle-list]');
var $uitems = $basicGiftWrap.find('[data-uitem_no]');
$uitems.removeClass('selected');
$basicGiftWrap.find('[data-option-selectname]').text('사은품을 선택해 주세요.');
$toggleList.addClass('disabled');
var giftCondition = (function () {
if (_this.jewelry) {
return !getData.itemOptionType.length;
} else {
return (getData.manyUitemYn == 'N') && (!getData.itemOptionType.length);
}
})();
if (giftCondition) {
this.able(props);
}
_this.product.toolbar.sync({
data: _this.$optionSection.html()
});
}
},
able: function (props) {
var deferred = $.Deferred();
var itemNo = props.itemNo;
var params = _this.params;
var getData = params.getData(itemNo);
if ((getData.itemGiftApplyYn == 'Y') && !this.state.soldout) {
var $toggleList = $basicGiftWrap.find('[data-toggle-list]');
$toggleList.removeClass('disabled');
} else {
deferred.resolve();
}
return deferred.promise();
},
init: function (props) {
var itemNo = props.itemNo;
var params = _this.params;
var getData = params.getData(itemNo);
if (getData.itemGiftApplyYn == 'Y') {
var itemList = _this.makehtml.get.itemList({
name: getData.itemNo
});
var giftType = _this.makehtml.get.giftType({
name: getData.itemNo,
data: getData.itemGift
});
var $itemList = $(itemList);
var $giftType = $(giftType);
$itemList.append($giftType);
$basicGiftWrap.append($itemList).css('display', '');
var giftItems = _this.makehtml.get.giftItems({
datas: getData.itemGift
});
if (giftItems.hasAllSoldout) {
this.state.soldout = true;
var $giftItem = $basicGiftWrap.find('[data-giftitem]');
var $infoBox = $giftItem.find('.info_box');
$basicGiftWrap.find('[data-toggle-list]').remove();
$infoBox.empty().append(giftItems.html);
} else {
var $optionviewListDropdown = $basicGiftWrap.find('[data-optionview-list="dropdown"]');
$basicGiftWrap.find('[data-option-selectname]').text('사은품을 선택해 주세요.');
$optionviewListDropdown.empty().append(giftItems.html);
}
}
}
},
initialize: function () {
this.prices.selectDatas = [];
$basicOptionWrap.empty();
$basicGiftWrap.empty().hide();
$selectOptionWrap.empty().hide();
$priceOptionWrap.hide();
this.init(_this.opts.itemNo);
},
reset: function (props) {
var $getItems = _this.params.getItems(props.$itemList);
for (var gi = 0, gm = $getItems.length; gi < gm; gi++) {
var $item = $getItems.eq(gi);
$item.removeAttr('data-selected-value');
$item.find('[data-option-selectname]').text($item.attr('data-itemoptiontype_name') + ' 옵션을 선택해 주세요.');
$item.find('[data-optionview-list] li').removeClass('selected');
if (_this.jewelry) {
_this.methods.jwformhide($item.find('[data-toggle-list]'));
}
if (gi != 0) {
$item.find('[data-toggle-list]').addClass('disabled');
$item.find('[data-chip-el]').hide();
} else {
$item.find('[data-chip-el]').find('input').prop('checked', false);
$item.find('[data-chip-el]').find('input').removeAttr('checked');
}
}
_this.delivery.reset();
this.gift.reset(props);
_this.product.toolbar.sync({
data: _this.$optionSection.html()
});
},
run: function (props) {
var itemNo = props.itemNo;
var $itemList = props.$itemList;
var params = _this.params;
var getData = params.getData(itemNo);
var getItemDatas = params.getItemDatas($itemList);
var $willLoadElement = getItemDatas.willLoadElement;
this.gift.disable(props);
if ($willLoadElement != null) {
var lowerVendNo = getData.lowerVendNo;
var parentItemNo = null;
var parentItemTcode = _this.itemTcode;
if (_this.opts.parentOpts != null) {
if (_this.opts.parentOpts.hasOwnProperty('itemNo')) {
parentItemNo = _this.opts.parentOpts.itemNo;
}
if (_this.opts.parentOpts.hasOwnProperty('itemTcode')) {
parentItemTcode = _this.opts.parentOpts.itemTcode;
}
}
var optionApiData = {
url: itemApis.prefix.optionApi,
data: {
itemNo: itemNo,
lowerVendNo: lowerVendNo,
itemTcode: parentItemTcode
},
complete: function () {
_this.loader.options.finish();
}
};
if (parentItemNo != null) {
optionApiData.data.groupItemNo = parentItemNo;
}
if (_this.jewelry) {
optionApiData.data.itemOptionNoList = $willLoadElement.attr('data-itemoptiontype_inputno');
} else {
if (getItemDatas.selectedValues != null) {
optionApiData.data.itemOptionNoList = getItemDatas.selectedValues;
}
}
_this.calendar.reset();
_this.loader.options.run();
itemApis.getApi(optionApiData).done(function (response) {
var aResponse = response;
if (aResponse.resultCode == 200) {
var origin = aResponse.data[itemApis.keyName.optionApi];
var clone = Util.def({}, origin);
var aClone = [];
for (var ck in clone) {
aClone[ck] = clone[ck];
}
let reWhsInLoginPromiseData = isLogin() ? getLoginPromiseData("rewhsin") : '{"type":"reload"}';
var optionItems = _this.makehtml.get.optionItems({
datas: aClone,
itemNo: itemNo,
getItemDatas: getItemDatas,
reWhsInLoginPromiseData: reWhsInLoginPromiseData
});
var optionChipItems = _this.makehtml.get.optionChipItems({
datas: aClone,
itemNo: itemNo,
$itemList: $itemList,
getItemDatas: getItemDatas
});
var $optionItems = $(optionItems);
var $optionChipItems = $(optionChipItems);
var $toggleList = $willLoadElement.find('[data-toggle-list]');
var $optionsoldoutCheck = $willLoadElement.find('[data-optionsoldout-check]');
var $optionviewListDropdown = $willLoadElement.find('[data-optionview-list="dropdown"]');
$toggleList.removeClass('disabled');
if ($optionsoldoutCheck.prop('checked')) {
$optionItems.not(':not(.sold_out)').hide();
}
$optionviewListDropdown.empty().append($optionItems);
if ($optionChipItems.length) {
var $optionviewChip = $willLoadElement.find('[data-chip-el]');
var $optionviewListChip = $willLoadElement.find('[data-optionview-list="chip"]');
$optionviewListChip.empty().append($optionChipItems);
$optionviewChip.css('display', '');
}
// 옵션 비활성화
$willLoadElement.find('[data-option-selectname]').text($willLoadElement.attr('data-itemoptiontype_name') + ' 옵션을 선택해 주세요.');
_this.methods.disabledOptionNextAll($willLoadElement);
_this.product.toolbar.sync({
data: _this.$optionSection.html()
});
}
});
} else {
this.gift.able(props).done(function () {
this.prices.add(props);
}.bind(this));
_this.product.toolbar.sync({
data: _this.$optionSection.html()
});
}
},
init: function (itemNo) {
_this.product.state = 'alone';
var params = _this.params;
var getData = params.getData(itemNo);
var props = {
itemNo: itemNo
};
var condition = (function () {
if (_this.jewelry) {
return getData.itemOptionType.length;
} else {
return (getData.manyUitemYn == 'Y') && (getData.itemOptionType.length);
}
})();
this.gift.init(props);
if (condition) {
var itemList = _this.makehtml.get.itemList({
name: getData.itemNo
});
var optionTypes = _this.makehtml.get.optionTypes({
name: getData.itemNo,
datas: getData.itemOptionType
});
var $itemList = $(itemList);
var $optionTypes = $(optionTypes);
$itemList.append($optionTypes);
$basicOptionWrap.append($itemList).css('display', '');
props.$itemList = $itemList;
this.run(props);
} else {
$basicOptionWrap.hide();
this.gift.able(props).done(function () {
if (getData.itemGiftApplyYn == 'Y') {
this.prices.add(props);
} else {
this.prices.add(Util.def({
onlyPrice: true
}, props));
}
}.bind(this));
}
var giftCondition = (function () {
if (_this.jewelry) {
return !getData.itemOptionType.length;
} else {
return (getData.manyUitemYn == 'N') && (!getData.itemOptionType.length);
}
})();
if (giftCondition) {
this.gift.able(props);
}
this.prices.initialize();
}
},
bundle: {
prices: {
compositionDatas: [],
selectDatas: [],
isSelected: function (props) {
var params = _this.params;
var selectDatas = this.selectDatas;
var compositionDatas = props.compositionDatas;
var sameValue = false;
var selectDatasKey = [];
selectDatas.forEach(function (data) {
if (data != null) {
var selectedValues = data.key.selectedValues;
selectDatasKey.push(selectedValues);
}
});
var compositionDatasKey = [];
compositionDatas.forEach(function (data) {
var selected = data.selected;
var $itemList = selected.$itemList;
var getItemDatas = params.getItemDatas($itemList);
compositionDatasKey.push($itemList.attr('data-selected-composition-value'));
if (_this.jewelry) {
compositionDatasKey.push(JSON.stringify(getItemDatas.selectedValues));
} else {
compositionDatasKey.push(getItemDatas.selectedValues);
}
});
if (selectDatasKey.indexOf(compositionDatasKey.join('-')) != -1) {
sameValue = true;
}
return sameValue;
},
change: function (e) {
if (_this.loader.options.state) return;
var $el = $(e.currentTarget);
var $child = $el.closest('[data-priceitem]');
var idx = $child.attr('data-price-idx');
var selectDataSave = this.selectDatas[idx].save;
var oncePurchasePossMaxQty = selectDataSave.oncePurchasePossMaxQty;
var onepPurchasePossMaxQty = selectDataSave.onepPurchasePossMaxQty;
var sellPossQty = selectDataSave.sellPossQty;
var aMin = [];
if (typeof oncePurchasePossMaxQty == 'number') {
aMin.push(oncePurchasePossMaxQty);
}
if (typeof onepPurchasePossMaxQty == 'number') {
aMin.push(onepPurchasePossMaxQty);
}
if (typeof sellPossQty == 'number') {
aMin.push(sellPossQty);
}
var current = $.trim($el.val());
if (isNaN(current)) {
current = 1;
}
var minVal = Math.min.apply(null, aMin);
selectDataSave.current = current;
if (selectDataSave.current < selectDataSave.min) {
selectDataSave.current = selectDataSave.min;
} else if (selectDataSave.current > minVal) {
selectDataSave.current = minVal;
}
this.pushData($el);
},
minus: function (e) {
e.preventDefault();
if (_this.loader.options.state) return;
var $el = $(e.currentTarget);
var $child = $el.closest('[data-priceitem]');
var idx = $child.attr('data-price-idx');
var selectDataSave = this.selectDatas[idx].save;
selectDataSave.current--;
if (selectDataSave.current < selectDataSave.min) {
selectDataSave.current = selectDataSave.min;
win.alert(message.uitemMin.replace('{{N}}', selectDataSave.min));
}
this.pushData($el);
},
plus: function (e) {
e.preventDefault();
if (_this.loader.options.state) return;
var $el = $(e.currentTarget);
var $child = $el.closest('[data-priceitem]');
var idx = $child.attr('data-price-idx');
var selectDataSave = this.selectDatas[idx].save;
var oncePurchasePossMaxQty = selectDataSave.oncePurchasePossMaxQty;
var onepPurchasePossMaxQty = selectDataSave.onepPurchasePossMaxQty;
var sellPossQty = selectDataSave.sellPossQty;
var aMin = [];
if (typeof oncePurchasePossMaxQty == 'number') {
aMin.push(oncePurchasePossMaxQty);
}
if (typeof onepPurchasePossMaxQty == 'number') {
aMin.push(onepPurchasePossMaxQty);
}
if (typeof sellPossQty == 'number') {
aMin.push(sellPossQty);
}
var minVal = Math.min.apply(null, aMin);
selectDataSave.current++;
if (selectDataSave.current > minVal) {
selectDataSave.current = minVal;
win.alert(message.uitemMax.replace('{{N}}', minVal));
}
this.pushData($el);
},
del: function (e) {
e.preventDefault();
if (_this.loader.options.state) return;
var $el = $(e.currentTarget);
var $child = $el.closest('[data-priceitem]');
var idx = $child.attr('data-price-idx');
this.selectDatas[idx] = null;
$child.remove();
this.totalPrice();
},
pushData: function ($el) {
var itemTcode = _this.itemTcode;
var getData = _this.params.getData(_this.opts.itemNo);
var $child = $el.closest('[data-priceitem]');
var $priceSize = $child.find('[data-pricesize]');
var $priceText = $child.find('[data-price-text]');
var idx = $child.attr('data-price-idx');
var selectDataSave = this.selectDatas[idx].save;
var current = selectDataSave.current;
var calculateType = $priceOptionWrap.attr('data-calculate-type') == isUndefined ? 'dispItemPrice' : $priceOptionWrap.attr('data-calculate-type');
if (itemTcode == '70') {
calculateType = 'sellPrice';
}
var saveR = selectDataSave[calculateType];
var fr = 0;
if (itemTcode == '70') {
if (getData.ratioAmountDcode == '10' || getData.ratioAmountDcode == '20') {
if (getData.ratioAmountDcode == '10') {
fr = Math.round(saveR * (getData.ratioAmountValue / 100) / 10) * 10;
} else {
fr = getData.ratioAmountValue;
}
}
}
var itemPrice = (current * saveR) - (current * fr);
$priceSize.val(selectDataSave.current);
$priceSize.attr('value', selectDataSave.current);
$priceText.text(_this.params.getCurrency(itemPrice));
$child.attr('data-itemprice', itemPrice);
this.totalPrice();
},
savePriceData: function (props) {
var params = _this.params;
var compositionDatas = this.compositionDatas;
var delivery = props.delivery;
let isJewelry = _this.jewelry;
var bundlePriceItems = [];
var build = function (data) {
bundlePriceItems.push(data);
};
var isSelected = this.isSelected({
compositionDatas: compositionDatas
});
if (isSelected) {
win.alert('이미 추가된 옵션입니다. 수량 조절은 아래 선택사항에서 해주십시오.');
} else {
compositionDatas.forEach(function (data) {
build(data);
});
var priceItem = _this.makehtml.get.priceBundleItem({
delivery: delivery,
data: bundlePriceItems
});
var $priceItem = $(priceItem);
$priceItem.attr('data-price-idx', this.selectDatas.length);
var selectDataPush = (function () {
var r = {
key: {
compositionDatas: compositionDatas
},
save: {}
};
var dispItemPrice = 0;
var sellPrice = 0;
var bundleSelectedValues = [];
bundlePriceItems.forEach(function (item) {
var getItemDatas = params.getItemDatas(item.selected.$itemList);
if (isJewelry) {
dispItemPrice += item.selected.origin.data.Price;
sellPrice += item.selected.origin.data.NorPrice;
} else {
dispItemPrice += item.selected.origin.data.dispItemPrice;
sellPrice += item.selected.origin.data.sellPrice;
}
bundleSelectedValues.push(item.selected.$itemList.attr('data-selected-composition-value'));
if (isJewelry) {
bundleSelectedValues.push(JSON.stringify(getItemDatas.selectedValues));
} else {
bundleSelectedValues.push(getItemDatas.selectedValues);
}
});
r.save.dispItemPrice = dispItemPrice;
r.save.sellPrice = sellPrice;
r.key.selectedValues = bundleSelectedValues.join('-');
return r;
})();
if (_this.itemTcode == '70') {
var activeData = _this.params.getData(_this.opts.itemNo);
} else if (_this.itemTcode == '80') {
var activeData = compositionDatas[0].selected.save;
}
if (isJewelry) {
selectDataPush.save.min = 1;
selectDataPush.save.current = 1;
} else {
selectDataPush.save.min = activeData.purchasePossMiniQty;
selectDataPush.save.current = activeData.purchasePossMiniQty;
}
selectDataPush.save.purchasePossMiniQty = activeData.purchasePossMiniQty;
selectDataPush.save.oncePurchasePossMaxQty = activeData.oncePurchasePossMaxQty;
selectDataPush.save.onepPurchasePossMaxQty = activeData.onepPurchasePossMaxQty;
var cartProps = [];
var priceProps = [];
var saveSellPossQty = [];
var jwData = {};
var jwTextData = {};
compositionDatas.forEach(function (compositionData) {
var compositionItem = compositionData.compositionItem;
var selected = compositionData.selected;
let selectedOptionInfos = selected.selectedOptionInfos;
jwData = selected.origin.data.jwData;
jwTextData = selected.origin.data.jwTextData;
var cartData = {
itemNo: selected.key.itemNo,
prodCode: selected.origin.data.ProdCode,
cartUitemNo: selected.key.uitemNo,
lowerVendNo: selected.key.lowerVendNo,
itemCompositionGroupSn: compositionItem.itemCompositionGroupSn,
selectedOptionInfos: selectedOptionInfos,
isJewelry: isJewelry
};
var priceData = {
sellPrice: isJewelry ? selected.origin.data.NorPrice : selected.origin.data.sellPrice,
dispItemPrice: isJewelry ? selected.origin.data.Price : selected.origin.data.dispItemPrice
};
if (selected.key.itemCompositionDetailNo != null) {
cartData.itemCompositionDetailNo = selected.key.itemCompositionDetailNo;
}
if (selected.save.sellPossQty !== isUndefined) {
saveSellPossQty.push(selected.save.sellPossQty);
}
cartProps.push(cartData);
priceProps.push(priceData);
});
selectDataPush.save.sellPossQty = Math.min.apply(null, saveSellPossQty);
this.selectDatas.push(selectDataPush);
if (_this.itemTcode == '70') {
cartProps.forEach(function (cp) {
cp['sitemItemNo'] = null;
cp['sitemUitemNo'] = null;
cp['sitemLowerVendNo'] = null;
});
} else if (_this.itemTcode == '80') {
var activeCartData = compositionDatas[0].selected.origin;
if (activeCartData.data.hasOwnProperty('gift')) {
cartProps[0]['sitemItemNo'] = activeCartData.data.gift.itemNo;
cartProps[0]['sitemUitemNo'] = activeCartData.data.gift.uitemNo;
cartProps[0]['sitemLowerVendNo'] = activeCartData.data.gift.lowerVendNo;
} else {
cartProps[0]['sitemItemNo'] = null;
cartProps[0]['sitemUitemNo'] = null;
cartProps[0]['sitemLowerVendNo'] = null;
}
}
$priceItem.attr('data-cartdata', JSON.stringify(cartProps));
$priceItem.attr('data-pricedata', JSON.stringify(priceProps));
$priceItem.attr('data-jwdata', jwData);
if (jwTextData != null) {
$priceItem.attr('data-textdata', JSON.stringify(jwTextData));
}
var dApi = $selectDeliveryWrap.attr('data-delivery-api');
if ((_this.itemTcode == '80') && (dApi != isUndefined)) {
Util.def(delivery, JSON.parse(dApi));
}
$priceItem.attr('data-deliverydata', JSON.stringify(delivery));
$selectOptionWrap.find('ul').prepend($priceItem);
$selectOptionWrap.css('display', '');
_this.outCallback('selected');
_this.product.bundle.reset();
}
},
totalPrice: function () {
var itemTcode = _this.itemTcode;
var getData = _this.params.getData(_this.opts.itemNo);
var selectDatas = this.selectDatas;
var $childs = $selectOptionWrap.find('[data-priceitem]');
var calculateType = $priceOptionWrap.attr('data-calculate-type') == isUndefined ? 'dispItemPrice' : $priceOptionWrap.attr('data-calculate-type');
if (itemTcode == '70') {
calculateType = 'sellPrice';
}
var r = 0;
var build = function (data) {
if (data != null) {
var save = data.save;
var saveR = save[calculateType];
var fr = 0;
if (itemTcode == '70') {
if (getData.ratioAmountDcode == '10' || getData.ratioAmountDcode == '20') {
if (getData.ratioAmountDcode == '10') {
fr = Math.round(saveR * (getData.ratioAmountValue / 100) / 10) * 10;
} else {
fr = getData.ratioAmountValue;
}
}
}
r += save.current * (saveR - fr);
}
};
selectDatas.forEach(function (data) {
build(data);
});
$priceOptionWrap.find('[data-option-totalprice]').text(_this.params.getCurrency(r));
if ($childs.length) {
$priceOptionWrap.css('display', '');
} else {
$selectOptionWrap.hide();
$priceOptionWrap.hide();
}
_this.product.toolbar.sync({
data: _this.$optionSection.html(),
totalPrice: _this.params.getCurrency(r)
});
},
allAddDone: function (props) {
var hasSelected = true;
this.compositionDatas.forEach(function (data) {
if (data.selected == null) {
hasSelected = false;
}
});
if (hasSelected) {
_this.delivery.state.complete = true;
_this.delivery.storelayer.closeLayer();
if ((props != isUndefined) && props.hasOwnProperty('delivery')) {
this.savePriceData({
delivery: props.delivery
});
this.totalPrice();
} else {
_this.delivery.able().done(function (deliveryProp) {
this.savePriceData({
delivery: deliveryProp
});
this.totalPrice();
}.bind(this));
}
} else {
_this.delivery.state.complete = false;
}
},
getSelectedOptionInfos: function ($itemList) {
if ($itemList === undefined || $itemList === null) {
return [];
}
let selectedOptionInfos = [];
try {
$itemList.children("li").each(function () {
const $this_ = $(this);
const itemoptiontype_name = $this_.data("itemoptiontype_name");
if (itemoptiontype_name === '색상' || itemoptiontype_name === '사이즈') {
const itemoption_no = $this_.attr("data-selected-value");
const $span_ = $this_[0].children[1].children[0].children[0].children[0];
const selected_name = $span_.textContent;
let selectedOption = {};
selectedOption["optionNo"] = itemoption_no;
selectedOption["optionType"] = itemoptiontype_name;
selectedOption["optionValue"] = selected_name;
selectedOptionInfos.push(selectedOption);
}
});
} catch (error) {
selectedOptionInfos = [];
}
return selectedOptionInfos;
},
jwAdd: function (props) {
var itemNo = props.itemNo;
var $itemList = props.$itemList;
var params = _this.params;
var getItemDatas = params.getItemDatas($itemList);
var compositionItems = _this.product.bundle.compositionItems;
var getData = _this.product.bundle.getData(itemNo);
var selectedValues = getItemDatas.selectedValues;
var selectedNames = getItemDatas.selectedNames;
var $compositionIdx = $itemList.closest('[data-composition_idx]');
var compositionIdx = $compositionIdx.attr('data-composition_idx');
var activeCompositionItem = compositionItems[compositionIdx];
var itemCompositions = activeCompositionItem.itemComposition;
var jwTextData = params.getTextData($itemList);
var jwData = {};
let selectedOptionInfos = this.getSelectedOptionInfos($itemList);
var gift = props.hasOwnProperty("gift") ? props.gift : null;
var giftValue = props.hasOwnProperty("giftValue") ? props.giftValue : null;
var activeItemComposition = itemCompositions.filter(function (itemComposition) {
return itemComposition.itemNo == itemNo;
})[0];
var title = (function () {
var r = null;
var uitemName = (function () {
var r = [];
var $getItems = getItemDatas.getItems;
var selectedNames = getItemDatas.selectedNames;
for (var gm = 0, gx = $getItems.length; gm < gx; gm++) {
var $getItem = $getItems.eq(gm);
var key = $getItem.attr('data-itemoptiontype_name');
r.push(key + ':' + selectedNames[gm]);
}
return r.join(' / ');
})();
var parsingNames = function () {
var r = '';
if (selectedNames != null && selectedNames.length) {
r = ' : ' + selectedNames.join(' : ');
}
return r;
};
if (_this.itemTcode === '80') {
if (_this.jewelry) {
r = $itemList.find('[data-compositionitem] [data-option-selectname]').text() + uitemName;
} else {
r = $itemList.find('[data-compositionitem] [data-option-selectname]').text() + parsingNames();
}
} else {
if (activeItemComposition.manyUitemYn === 'N') {
r = activeItemComposition.itemName;
} else {
r = $itemList.find('[data-compositionitem] [data-option-selectname]').text() + parsingNames();
}
}
return r;
})();
var dataOpts = {};
dataOpts['BrandCode'] = getData.brandCode;
dataOpts['StyleCode'] = getData.modelNo;
var ajaxCall = function (props) {
_this.loader.options.run();
jwData = JSON.stringify(props.data);
var cb = props != isUndefined && props.hasOwnProperty('complete') ? props.complete : function () {};
var allAddDoneFunc = props != isUndefined && props.hasOwnProperty("allAddDone") ? props.allAddDone : function () {};
$.ajax({
type: 'POST',
dataType: 'json',
contentType: 'application/json',
url: itemApis.prefix.jwUitemApi,
data: jwData,
headers: {
'Authorization': 'ZWxtOmdldHByaWNlMjAyMQ=='
},
complete: function () {
_this.loader.options.finish();
cb();
}
}).done(function (response) {
var aResponse = response;
if ('200' === aResponse.resultCode) {
if ("200" === aResponse.data.ResultCode) {
var origin = aResponse.data['Content'];
origin['selectedItem'] = getData;
origin['jwData'] = jwData;
origin['jwTextData'] = jwTextData;
if (gift) {
origin['gift'] = gift;
}
if (giftValue) {
origin['giftValue'] = giftValue;
}
props.compositionDatas[compositionIdx].selected = {
key: {
itemNo: itemNo,
lowerVendNo: getData.lowerVendNo,
brandCode: getData.brandCode,
styleCode: getData.modelNo,
selectedValues: selectedValues,
selectedNames: selectedNames
},
save: {
oncePurchasePossMaxQty: getData.oncePurchasePossMaxQty,
onepPurchasePossMaxQty: getData.onepPurchasePossMaxQty,
sellPossQty: origin.sellPossQty,
min: 1,
current: 1,
norPrice: origin.NorPrice,
price: origin.Price
},
$itemList: $itemList,
selectedOptionInfos: selectedOptionInfos,
origin: Util.def({
title: title == null ? origin.uitemName : title
}, props, {
data: origin
})
};
allAddDoneFunc();
} else {
win.alert(aResponse.data.Message[1]);
}
}
})
};
if (!getData.optionTypeName.length) {
ajaxCall({
data: dataOpts,
compositionDatas: this.compositionDatas,
allAddDone: function () {
_this.product.bundle.prices.allAddDone();
}
});
} else {
dataOpts['OptionCode'] = selectedValues;
ajaxCall({
data: dataOpts,
compositionDatas: this.compositionDatas,
complete: function () {
_this.product.bundle.reset(props);
},
allAddDone: function () {
_this.product.bundle.prices.allAddDone();
}
});
}
},
add: function (props) {
if (_this.jewelry) {
this.jwAdd(props);
return;
}
var itemNo = props.itemNo;
var $itemList = props.$itemList;
var params = _this.params;
var getItemDatas = params.getItemDatas($itemList);
var compositionItems = _this.product.bundle.compositionItems;
var getData = _this.product.bundle.getData(itemNo);
var lowerVendNo = getData.manyUitemYn == 'N' ? getData.lowerVendNo : props.lowerVendNo;
var selectedValues = getItemDatas.selectedValues;
var selectedNames = getItemDatas.selectedNames;
var $compositionIdx = $itemList.closest('[data-composition_idx]');
var compositionIdx = $compositionIdx.attr('data-composition_idx');
var activeCompositionItem = compositionItems[compositionIdx];
var itemCompositions = activeCompositionItem.itemComposition;
let selectedOptionInfos = this.getSelectedOptionInfos($itemList);
var activeItemComposition = itemCompositions.filter(function (itemComposition) {
return itemComposition.itemNo == itemNo;
})[0];
var title = (function () {
var r = null;
var parsingNames = function () {
var r = '';
if (selectedNames != null && selectedNames.length) {
r = ' : ' + selectedNames.join(' : ');
}
return r;
};
if (_this.itemTcode == '80') {
r = $itemList.find('[data-compositionitem] [data-option-selectname]').text() + parsingNames();
} else {
if (activeItemComposition.manyUitemYn == 'N') {
r = activeItemComposition.itemName;
} else {
r = $itemList.find('[data-compositionitem] [data-option-selectname]').text() + parsingNames();
}
}
return r;
})();
_this.loader.options.run();
itemApis.getApi({
url: itemApis.prefix.uitemApi,
data: {
itemNo: itemNo,
lowerVendNo: lowerVendNo,
itemOptionNoList: selectedValues,
itemCompositionGroupSn: activeCompositionItem.itemCompositionGroupSn,
setItemNo: _this.opts.itemNo,
immeDcBenefitValueDcode: activeItemComposition.immeDcBenefitValueDcode,
immeDcBenefitValue: activeItemComposition.immeDcBenefitValue,
immeDcMaxDcAmount: activeItemComposition.immeDcMaxDcAmount,
maxmembersApplyYn: activeItemComposition.maxmembersItemYn
},
complete: function () {
_this.loader.options.finish();
}
}).done(function (response) {
var aResponse = response;
if (aResponse.resultCode == 200) {
var origin = aResponse.data;
this.compositionDatas[compositionIdx].selected = {
key: {
itemNo: itemNo,
lowerVendNo: lowerVendNo,
uitemNo: origin.uitemNo,
itemCompositionDetailNo: origin.hasOwnProperty('itemCompositionDetailNo') ? origin.itemCompositionDetailNo : null,
selectedValues: selectedValues
},
save: {
min: origin.purchasePossMiniQty,
current: origin.purchasePossMiniQty,
purchasePossMiniQty: origin.purchasePossMiniQty,
sellPossQty: origin.sellPossQty,
sellPrice: origin.sellPrice,
dispItemPrice: origin.dispItemPrice,
price: origin.sellPrice
},
$itemList: $itemList,
selectedOptionInfos: selectedOptionInfos,
origin: Util.def({
title: title == null ? origin.uitemName : title
}, props, {
data: origin
}),
selectedItem: activeItemComposition
};
this.allAddDone();
}
}.bind(this));
},
bindEvents: function (type) {
if (type) {
$selectOptionWrap.on(_this.changeEvents('change'), '[data-priceitem] [data-pricesize]', this.change.bind(this));
$selectOptionWrap.on(_this.changeEvents('click'), '[data-priceitem] [data-pricesize-minus]', this.minus.bind(this));
$selectOptionWrap.on(_this.changeEvents('click'), '[data-priceitem] [data-pricesize-plus]', this.plus.bind(this));
$selectOptionWrap.on(_this.changeEvents('click'), '[data-priceitem] [data-price-del]', this.del.bind(this));
} else {
$selectOptionWrap.off(_this.changeEvents('change'));
$selectOptionWrap.off(_this.changeEvents('click'));
}
},
destroy: function () {
this.bindEvents(false);
},
init: function () {
var compositionItems = _this.product.bundle.compositionItems;
compositionItems.forEach(function (item, idx) {
this.compositionDatas[idx] = {
compositionItem: item,
selected: null
};
}.bind(this));
var priceList = _this.makehtml.get.priceList();
var $priceList = $(priceList);
$selectOptionWrap.append($priceList);
this.bindEvents(true);
},
initialize: function () {
this.destroy();
this.init();
}
},
compositionDatas: {},
compositionItems: [],
gift: {
state: {
soldout: false
},
reset: function (props) {
this.disable(props);
},
run: function (props) {
_this.product.bundle.prices.add(Util.def(props, {
$itemList: $basicOptionWrap.find('[data-item_no]')
}));
},
disable: function (props) {
$basicGiftWrap.empty().hide();
_this.product.toolbar.sync({
data: _this.$optionSection.html()
});
},
datas: {},
getData: function (num) {
return this.datas.hasOwnProperty(num) ? this.datas[num] : null;
},
able: function (props) {
var deferred = $.Deferred();
var itemNo = props.itemNo;
var getData = this.getData(itemNo);
if ((getData != null) && getData.origin.length && !this.state.soldout) {
var $toggleList = $basicGiftWrap.find('[data-toggle-list]');
$toggleList.removeClass('disabled');
} else {
deferred.resolve();
}
return deferred.promise();
},
init: function (props) {
var deferred = $.Deferred();
var params = _this.params;
var itemNo = props.itemNo;
var lowerVendNo = props.lowerVendNo;
itemApis.getApi({
url: itemApis.prefix.siteUitemNameApi,
data: {
itemNo: itemNo,
lowerVendNo: lowerVendNo
},
complete: function () {
deferred.resolve();
}
}).done(function (response) {
var aResponse = response;
if (aResponse.resultCode == 200) {
var origin = aResponse.data[itemApis.keyName.uitemApi];
this.datas[itemNo] = {
origin: origin
};
if (origin.length) {
var itemList = _this.makehtml.get.itemList({
name: itemNo
});
var giftType = _this.makehtml.get.giftType({
name: itemNo,
data: origin
});
var $itemList = $(itemList);
var $giftType = $(giftType);
$itemList.append($giftType);
$basicGiftWrap.empty().append($itemList).css('display', '');
var giftItems = _this.makehtml.get.giftItems({
datas: origin
});
if (giftItems.hasAllSoldout) {
this.state.soldout = true;
var $giftItem = $basicGiftWrap.find('[data-giftitem]');
var $infoBox = $giftItem.find('.info_box');
$basicGiftWrap.find('[data-toggle-list]').remove();
$infoBox.empty().append(giftItems.html);
} else {
this.state.soldout = false;
var $optionviewListDropdown = $basicGiftWrap.find('[data-optionview-list="dropdown"]');
$basicGiftWrap.find('[data-option-selectname]').text('사은품을 선택해 주세요.');
$optionviewListDropdown.empty().append(giftItems.html);
}
} else {
$basicGiftWrap.empty().hide();
}
}
}.bind(this));
return deferred.promise();
}
},
initialize: function () {
this.prices.selectDatas = [];
var $compositions = _this.$optionSection.find('[data-composition_idx]');
$compositions.not($basicOptionWrap).remove();
$basicOptionWrap.empty().removeAttr('data-composition_idx');
$basicGiftWrap.empty().hide();
$selectOptionWrap.empty().hide();
$priceOptionWrap.hide();
this.init(_this.opts.itemNo);
},
reset: function (props) {
var compositionDatas = this.prices.compositionDatas;
var hasSelected = true;
compositionDatas.forEach(function (data) {
if (data.selected == null) {
hasSelected = false;
}
});
if (hasSelected) {
var reset = function (data) {
var selected = data.selected;
var $itemList = selected.$itemList;
var $getItems = _this.params.getItems($itemList);
var $compositionItem = $itemList.find('[data-compositionitem]');
var $compositionToggleList = $compositionItem.find('[data-toggle-list]');
var $compositionToggleActive = $compositionItem.find('[data-toggle-active]');
var $compositionActiveEl = $compositionItem.find('[data-option-selectname]');
$compositionActiveEl.text('상품을 선택해 주세요.');
$compositionItem.find('[data-optionview-list] li').removeClass('selected');
$compositionToggleList.removeClass('box_prd');
$compositionToggleActive.append($compositionActiveEl);
$compositionToggleActive.find('.img_prd_select').remove();
$compositionToggleActive.addClass('btn_select option');
$compositionActiveEl.removeClass('name');
for (var gi = 0, gm = $getItems.length; gi < gm; gi++) {
var $item = $getItems.eq(gi);
$item.removeAttr('data-selected-value');
$item.find('[data-option-selectname]').text($item.attr('data-itemoptiontype_name') + ' 옵션을 선택해 주세요.');
$item.find('[data-optionview-list] li').removeClass('selected');
if (_this.jewelry) {
_this.methods.jwformhide($item.find('[data-toggle-list]'));
}
$item.find('[data-chip-el]').hide();
$item.find('[data-chip-el]').find('input').prop('checked', false);
$item.find('[data-chip-el]').find('input').removeAttr('checked');
$item.find('[data-toggle-list]').addClass('disabled');
}
};
compositionDatas.forEach(function (data) {
reset(data);
});
this.prices.compositionDatas = [];
var compositionItems = _this.product.bundle.compositionItems;
compositionItems.forEach(function (item, idx) {
this.prices.compositionDatas[idx] = {
compositionItem: item,
selected: null
};
}.bind(this));
_this.product.toolbar.sync({
data: _this.$optionSection.html()
});
}
_this.delivery.reset();
this.gift.reset(props);
},
run: function (props) {
var b = this;
var itemNo = props.itemNo;
var getData = this.getData(itemNo);
var lowerVendNo = getData.lowerVendNo;
var $itemList = props.$itemList;
var compositionIdx = $itemList.closest('[data-composition_idx]').attr('data-composition_idx');
var compositionLowerVendNo = props.compositionLowerVendNo;
var compositionDatas = this.prices.compositionDatas;
var itemTcode = _this.itemTcode;
var itemType = props.hasOwnProperty('itemType') ? props.itemType : null;
var isDeal = (itemTcode == '80') && ((itemType != null) && (itemType == 'composition'));
var params = _this.params;
var getItemDatas = params.getItemDatas($itemList);
var $willLoadElement = getItemDatas.willLoadElement;
var runCheck = {
option: false,
gift: false,
giftCall: false,
giftAble: function () {
if (this.gift && this.giftCall) {
b.gift.able(props).done(function () {
b.prices.add(props);
});
}
},
done: function () {
if (this.option && this.gift) {
_this.loader.options.finish();
_this.product.toolbar.sync({
data: _this.$optionSection.html()
});
}
}
};
if (isDeal) {
this.gift.init({
itemNo: itemNo,
lowerVendNo: compositionLowerVendNo
}).done(function (giftProps) {
runCheck.gift = true;
runCheck.giftAble();
runCheck.done();
}.bind(this));
} else {
runCheck.gift = true;
}
if ($willLoadElement != null) {
var parentItemNo = _this.itemNo;
var parentItemTcode = _this.itemTcode;
if (_this.opts.parentOpts != null) {
if (_this.opts.parentOpts.hasOwnProperty('itemNo')) {
parentItemNo = _this.opts.parentOpts.itemNo;
}
if (_this.opts.parentOpts.hasOwnProperty('itemTcode')) {
parentItemTcode = _this.opts.parentOpts.itemTcode;
}
}
var optionApiData = {
url: itemApis.prefix.optionApi,
data: {
itemNo: itemNo,
lowerVendNo: lowerVendNo,
itemTcode: parentItemTcode,
groupItemNo: parentItemNo
},
complete: function () {
runCheck.option = true;
runCheck.done();
}
};
if (_this.jewelry) {
optionApiData.data.itemOptionNoList = $willLoadElement.attr('data-itemoptiontype_inputno');
} else {
if (getItemDatas.selectedValues != null) {
optionApiData.data.itemOptionNoList = getItemDatas.selectedValues;
}
}
_this.loader.options.run();
itemApis.getApi(optionApiData).done(function (response) {
var aResponse = response;
if (aResponse.resultCode == 200) {
var origin = aResponse.data[itemApis.keyName.optionApi];
var clone = Util.def({}, origin);
var aClone = [];
let reWhsInLoginPromiseData = isLogin() ? getLoginPromiseData("rewhsin") : '{"type":"reload"}';
for (var ck in clone) {
aClone[ck] = clone[ck];
}
var optionItems = _this.makehtml.get.optionItems({
datas: aClone,
itemNo: itemNo,
getItemDatas: getItemDatas,
reWhsInLoginPromiseData: reWhsInLoginPromiseData
});
var optionChipItems = _this.makehtml.get.optionChipItems({
datas: aClone,
$itemList: $itemList,
getItemDatas: getItemDatas
});
var $optionItems = $(optionItems);
var $optionChipItems = $(optionChipItems);
var $toggleList = $willLoadElement.find('[data-toggle-list]');
var $optionsoldoutCheck = $willLoadElement.find('[data-optionsoldout-check]');
var $optionviewListDropdown = $willLoadElement.find('[data-optionview-list="dropdown"]');
$toggleList.removeClass('disabled');
if ($optionsoldoutCheck.prop('checked')) {
$optionItems.not(':not(.sold_out)').hide();
}
$optionviewListDropdown.empty().append($optionItems);
if ($optionChipItems.length) {
var $optionviewChip = $willLoadElement.find('[data-chip-el]');
var $optionviewListChip = $willLoadElement.find('[data-optionview-list="chip"]');
$optionviewListChip.empty().append($optionChipItems);
$optionviewChip.css('display', '');
}
// 옵션 비활성화
compositionDatas[compositionIdx].selected = null;
$willLoadElement.find('[data-option-selectname]').text($willLoadElement.attr('data-itemoptiontype_name') + ' 옵션을 선택해 주세요.');
_this.methods.disabledOptionNextAll($willLoadElement);
_this.product.toolbar.sync({
data: _this.$optionSection.html()
});
}
});
} else {
runCheck.option = true;
runCheck.giftCall = true;
runCheck.giftAble();
runCheck.done();
}
},
getData: function (num) {
return this.compositionDatas.hasOwnProperty(num) ? this.compositionDatas[num].data : null;
},
init: function (itemNo) {
_this.product.state = 'bundle';
var params = _this.params;
var getData = params.getData(itemNo);
var compositionItems = getData.compositionItem;
var $alignOptionWrap = $basicOptionWrap;
let reWhsInLoginPromiseData = isLogin() ? getLoginPromiseData("rewhsin") : '{"type":"reload"}';
compositionItems.forEach(function (compositionItem, idx) {
var itemCompositionGroupName = compositionItem.itemCompositionGroupName;
var itemList = _this.makehtml.get.itemList({
name: getData.itemNo
});
var compositionTypes = _this.makehtml.get.compositionTypes({
itemCompositionGroupSn: compositionItem.itemCompositionGroupSn,
datas: compositionItem.itemComposition,
reWhsInLoginPromiseData: reWhsInLoginPromiseData
});
if (_this.itemTcode == '80') {
if (getData.countRepresentPriceY <= 1) {
itemCompositionGroupName = '딜상품';
} else {
itemCompositionGroupName = compositionItem.itemCompositionGroupName;
}
}
var $groupName = $('' + itemCompositionGroupName + ' ');
var $itemList = $(itemList);
var $compositionTypes = $(compositionTypes);
$itemList.append($compositionTypes);
if (idx != 0) {
$alignOptionWrap.after('
');
$alignOptionWrap = $alignOptionWrap.next();
}
$alignOptionWrap.attr('data-composition_idx', idx);
$alignOptionWrap.append($groupName);
$alignOptionWrap.append($itemList);
});
this.compositionItems = compositionItems;
this.prices.initialize();
_this.product.toolbar.sync({
data: _this.$optionSection.html()
});
}
},
initialize: function () {
var state = this.state;
this[state].initialize();
this.toolbar.initialize();
}
}
});
},
buildParams: function () {
var _this = this;
var datas = this.datas;
Util.def(this, {
params: {
getCurrency: function (num) {
var r = Math.round(num).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
return r;
},
getData: function (num) {
return datas.hasOwnProperty(num) ? datas[num].data : null;
},
getItems: function ($wrap) {
var $items = $wrap.find('[data-optionitem]');
return $items;
},
getWillLoadElement: function ($wrap) {
var $items = $wrap.find('[data-optionitem]:not([data-selected-value])');
return $items.length ? $items.first() : null;
},
getSelectedValues: function ($wrap) {
var $items = $wrap.find('[data-optionitem][data-selected-value]');
var selectedValues = (function () {
if (_this.jewelry) {
var r = {};
for (var i = 0, max = $items.length; i < max; i++) {
var $selectedEl = $items.eq(i);
var rKey = $selectedEl.attr('data-itemoptiontype_inputno');
r[rKey] = $selectedEl.attr('data-selected-value');
}
return r;
} else {
var r = [];
for (var i = 0, max = $items.length; i < max; i++) {
var $selectedEl = $items.eq(i);
r.push($selectedEl.attr('data-selected-value'));
}
return r.join(',');
}
})();
return $items.length ? selectedValues : null;
},
getSelectedNames: function ($wrap) {
var $items = $wrap.find('[data-optionitem][data-selected-value]');
var selectedNames = (function () {
var r = [];
for (var i = 0, max = $items.length; i < max; i++) {
var $selectedEl = $items.eq(i);
var jwTextCondition = (function () {
var aJw = ['IS', 'OS'];
return _this.jewelry && (aJw.indexOf($selectedEl.attr('data-itemoptiontype_inputno')) != -1);
})();
if (jwTextCondition && $selectedEl.attr('data-selected-text') != isUndefined) {
var _text = $selectedEl.attr('data-selected-text');
} else {
var _text = $selectedEl.find('[data-option-selectname]').text();
}
r.push(_text);
}
return r;
})();
return $items.length ? selectedNames : null;
},
getItemDatas: function ($wrap) {
var r = {};
r.getItems = this.getItems($wrap);
r.willLoadElement = this.getWillLoadElement($wrap);
r.selectedValues = this.getSelectedValues($wrap);
r.selectedNames = this.getSelectedNames($wrap);
return r;
},
getJwItem: function ($wrap) {
var $items = $wrap.find('[data-jwitem]');
return $items;
},
getJwItemDatas: function ($wrap) {
var r = {};
r.getItems = this.getJwItem($wrap);
return r;
},
getTextData: function ($wrap) {
var $items = $wrap.find('[data-optionitem]');
var selected = (function () {
var r = {};
for (var i = 0, max = $items.length; i < max; i++) {
var $selectedEl = $items.eq(i);
var $jwTxt = $selectedEl.find('[data-jw-text]');
if ($jwTxt.length) {
var rKey = $selectedEl.attr('data-itemoptiontype_inputno');
r[rKey] = $jwTxt.val();
}
}
return r;
})();
return Object.keys(selected).length ? selected : null;
},
getMainApi: function () {
var deferred = $.Deferred();
var num = _this.opts.itemNo;
_this.loader.options.run();
itemApis.getApi({
url: itemApis.prefix.itemApi,
data: {
itemNo: num
},
complete: function () {
_this.loader.options.finish();
}
}).done(function (response) {
deferred.resolve(response);
});
return deferred.promise();
}
}
});
},
buildLoader: function () {
var $optionSection = this.$optionSection;
Util.def(this, {
loader: {
options: {
state: false,
instance: null,
stack: 0,
destroy: function () {
this.stack = 0;
this.finish();
},
finish: function () {
if (this.instance == null) return;
if (this.stack == 0) {
this.state = false;
this.instance.finish();
this.instance = null;
} else {
this.stack--;
}
},
run: function () {
this.state = true;
if (this.instance == null) {
this.instance = new win.CustomLoader($optionSection);
} else {
this.stack++;
}
}
},
destroy: function () {
this.options.destroy();
}
}
});
},
buildJwForm: function () {
Util.def(this, {
jwform: {
get: {
formbox: function (prop) {
var tit = prop.tit;
var maxLength = prop.maxlength;
var layouts = [];
layouts.push('');
layouts.push('
');
layouts.push(' ');
layouts.push('
');
layouts.push('
');
layouts.push('
');
return layouts.join('');
}
},
set: {
formbox: function (props) {
var $toggleList = props.$toggleList;
if ($toggleList.next('[data-form-box]').length) {
$toggleList.next().find('[data-jw-text]').focus();
} else {
var formbox = props.formbox;
var $formbox = $(formbox);
$toggleList.after($formbox);
}
}
}
}
});
},
buildMethods: function () {
var _this = this;
var $selectDeliveryWrap = this.$selectDeliveryWrap;
var $selectDeliveryList = $selectDeliveryWrap.find('.delivery_type');
Util.def(this, {
methods: {
jwformhide: function ($el) {
var $target = $el.next('[data-form-box]');
var $optionItem = $el.closest('[data-optionitem]');
$optionItem.removeAttr('data-selected-text');
if ($target.length) {
$target.remove();
}
},
jwformshow: function ($el) {
var product = _this.product;
if (product.state == 'alone') {
var prices = product[product.state].prices;
prices.aloneDatas.add = null;
}
var $target = $el.closest('li');
var $itemList = $el.closest('[data-item_no]');
var optionNo = $target.attr('data-option_no');
var $toggleList = $target.closest('[data-toggle-list]');
var $optionItem = $target.closest('[data-optionitem]');
var $selectName = $optionItem.find('[data-option-selectname]');
var $optionviewLists = $optionItem.find('[data-optionview-list]');
var $activeChilds = $optionviewLists.find('li').filter('[data-option_no="' + optionNo + '"]');
for (var i = 0, max = $activeChilds.length; i < max; i++) {
var $activeChild = $activeChilds.eq(i);
$activeChild.siblings().removeClass('selected');
}
$activeChilds.addClass('selected');
var $activeInputs = $activeChilds.find('input');
if ($activeInputs.length) {
$activeInputs.prop('checked', true);
}
$optionItem.attr('data-selected-value', optionNo);
$selectName.text($target.attr('data-value'));
// 옵션 비활성화
this.disabledOptionNextAll($optionItem);
var formbox = _this.jwform.get.formbox({
value: $target.attr('data-value'),
maxlength: $target.attr('data-option_length')
});
_this.jwform.set.formbox({
$toggleList: $toggleList,
formbox: formbox
});
_this.product.toolbar.sync({
data: _this.$optionSection.html()
});
},
jwcheck: function ($el) {
var $formbox = $el.closest('[data-form-box]');
var $jwTxt = $formbox.find('[data-jw-text]');
var $optionItem = $el.closest('[data-optionitem]');
var optionNo = $optionItem.attr('data-selected-value');
var $toggleList = $optionItem.closest('[data-toggle-list]');
var $optionviewLists = $optionItem.find('[data-optionview-list]');
var $activeChilds = $optionviewLists.find('li').filter('[data-option_no="' + optionNo + '"]');
$optionItem.attr('data-selected-text', $jwTxt.val());
this.itemcheck($activeChilds);
},
disabledOptionNextAll: function ($alignItem) {
var $disabledElements = $alignItem.nextAll();
for (var di = 0, dmax = $disabledElements.length; di < dmax; di++) {
var $disabledElement = $disabledElements.eq(di);
$disabledElement.removeAttr('data-selected-value');
$disabledElement.find('[data-toggle-list]').addClass('disabled');
$disabledElement.find('[data-option-selectname]').text($disabledElement.attr('data-itemoptiontype_name') + ' 옵션을 선택해 주세요.');
if (_this.jewelry) {
_this.methods.jwformhide($disabledElement.find('[data-toggle-list]'));
}
}
},
lastItemData: null,
itemcheck: function ($el) {
var $target = $el.closest('li');
var $itemList = $el.closest('[data-item_no]');
var optionNo = $target.attr('data-option_no');
var $optionItem = $target.closest('[data-optionitem]');
var $selectName = $optionItem.find('[data-option-selectname]');
var $optionviewLists = $optionItem.find('[data-optionview-list]');
var $activeChilds = $optionviewLists.find('li').filter('[data-option_no="' + optionNo + '"]');
for (var i = 0, max = $activeChilds.length; i < max; i++) {
var $activeChild = $activeChilds.eq(i);
$activeChild.siblings().removeClass('selected');
}
$activeChilds.addClass('selected');
var $activeInputs = $activeChilds.find('input');
if ($activeInputs.length) {
$activeInputs.prop('checked', true);
}
$optionItem.attr('data-selected-value', optionNo);
$selectName.text($target.attr('data-value'));
// 옵션 비활성화
this.disabledOptionNextAll($optionItem);
var productOpts = {
$itemList: $itemList,
itemNo: $itemList.attr('data-item_no'),
lowerVendNo: $target.attr('data-lowervend_no')
};
if (_this.product.state == 'bundle') {
productOpts.itemNo = $itemList.attr('data-selected-composition-value');
}
this.lastItemData = Util.def({}, productOpts);
_this.product[_this.product.state].run(productOpts);
},
calendarCheck: function (date) {
var $el = _this.calendar.$target;
var oData = Util.def({}, _this.calendar.oData);
var checkData = oData[date];
var $target = $el.closest('li');
var $itemList = $el.closest('[data-item_no]');
var optionNo = checkData.itemOptionNo;
var $optionItem = $target.closest('[data-optionitem]');
var $selectName = $optionItem.find('[data-option-selectname]');
var $optionviewLists = $optionItem.find('[data-optionview-list]');
var $activeChilds = $optionviewLists.find('li').filter('[data-option_no="' + optionNo + '"]');
for (var i = 0, max = $activeChilds.length; i < max; i++) {
var $activeChild = $activeChilds.eq(i);
$activeChild.siblings().removeClass('selected');
}
$activeChilds.addClass('selected');
var $activeInputs = $activeChilds.find('input');
if ($activeInputs.length) {
$activeInputs.prop('checked', true);
}
$optionItem.attr('data-selected-value', optionNo);
$selectName.text(checkData.itemOptionName);
// 옵션 비활성화
this.disabledOptionNextAll($optionItem);
var productOpts = {
$itemList: $itemList,
itemNo: $itemList.attr('data-item_no'),
lowerVendNo: checkData.lowerVendNo
};
if (_this.product.state == 'bundle') {
productOpts.itemNo = $itemList.attr('data-selected-composition-value');
}
this.lastItemData = Util.def({}, productOpts);
_this.product[_this.product.state].run(productOpts);
},
compositiondeliverychange: function (props) {
if (_this.itemTcode != '80') return;
var getData = _this.product.bundle.getData(props.itemNo);
var presentgivePossYn = getData.presentgivePossYn;
var shipFcode = getData.shipFcode;
var aShipFcodes = ['10', '11', '60'];
var willcallPossYn = getData.willcallPossYn;
var $allChilds = $selectDeliveryList.find('>li');
var $selectEls = null;
var addSelect = function ($el) {
if ($selectEls != null) {
$selectEls = $selectEls.add($el);
} else {
$selectEls = $el;
}
};
if (aShipFcodes.indexOf(shipFcode) != -1) {
addSelect($selectDeliveryList.find('>[data-shipname="d"]'));
} else if (shipFcode == '40') {
addSelect($selectDeliveryList.find('>[data-shipname="e"]'));
}
if (willcallPossYn == 'Y') {
addSelect($selectDeliveryList.find('>[data-callposs]'));
}
if ($selectEls != null) {
$selectEls.css('display', '');
$allChilds.not($selectEls).hide();
}
if (($selectEls != null) && ($selectEls.length > 1)) {
$selectDeliveryWrap.removeClass('is-hide');
$selectEls.find('input').removeAttr('checked').prop('checked', false);
} else {
$selectDeliveryWrap.addClass('is-hide');
if ($selectEls != null) {
$selectEls.find('input').attr('checked', 'checked').prop('checked', true);
}
}
var dApi = {
presentgivePossYn: presentgivePossYn,
shipFcode: shipFcode,
willcallPossYn: willcallPossYn
};
$selectDeliveryWrap.attr('data-delivery-api', JSON.stringify(dApi));
},
compositionitemchange: function (props) {
var type = props.type;
var name = props.name;
var idx = props.idx + 1;
var $target = props.$target;
var imgUrl = props.imgUrl;
var $toggleList = $target.find('[data-toggle-list]');
var $toggleActive = $target.find('[data-toggle-active]');
var $activeEl = $target.find('[data-option-selectname]');
$activeEl.text('선택' + idx + ') ' + name);
if (type == 'expand') {
$toggleList.addClass('box_prd');
$activeEl.addClass('name');
$toggleActive.removeClass('btn_select option');
if ($toggleActive.find('.img_prd_select').length) {
if (imgUrl != null) {
$toggleActive.find('.img_prd_select img').attr('src', imgUrl);
$toggleActive.find('.img_prd_select .thumb').css('display', '');
} else {
$toggleActive.find('.img_prd_select .thumb').hide();
}
} else {
var layouts = [];
layouts.push('');
if (imgUrl != null) {
layouts.push('');
layouts.push(' ');
} else {
layouts.push('');
layouts.push(' ');
}
layouts.push(' ');
layouts.push(' ');
var $el = $(layouts.join(''));
$toggleActive.append($el);
$el.append($activeEl);
}
} else {
$toggleActive.append($activeEl);
$toggleActive.find('.img_prd_select').remove();
$toggleList.removeClass('box_prd');
$activeEl.removeClass('name');
$toggleActive.addClass('btn_select option');
}
},
compositionitemcheck: function ($el) {
var compositionItems = _this.product.bundle.compositionItems;
var $itemNo = $el.closest('[data-item_no]');
var $compositionItem = $el.closest('[data-compositionitem]');
var $compositionIdx = $el.closest('[data-composition_idx]');
var compositionIdx = $compositionIdx.attr('data-composition_idx');
var $compositionItemNo = $el.closest('[data-compositionitem_no]');
var compositionItemNo = $compositionItemNo.attr('data-compositionitem_no');
var compositionLowerVendNo = $compositionItemNo.attr('data-lowervend_no');
var compositionItemNoIdx = $compositionItemNo.index();
var compositionItem = compositionItems[compositionIdx].itemComposition[compositionItemNoIdx];
var $optionviewLists = $compositionItem.find('[data-optionview-list]');
var $activeChilds = $optionviewLists.find('li').filter('[data-compositionitem_no="' + compositionItemNo + '"]');
var $isJewelry = $el.closest('[data-is_jewelry]');
var isJewelry = $isJewelry.attr('data-is_jewelry');
_this.jewelry = 'Y' === isJewelry;
for (var i = 0, max = $activeChilds.length; i < max; i++) {
var $activeChild = $activeChilds.eq(i);
$activeChild.siblings().removeClass('selected');
}
$activeChilds.addClass('selected');
var optionTypes = _this.makehtml.get.optionTypes({
name: compositionItem.itemNo,
idx: compositionIdx,
datas: compositionItem.optionTypeName
});
var $optionTypes = $(optionTypes);
$itemNo.attr('data-selected-composition-value', compositionItemNo);
$itemNo.find('[data-optionitem]').remove();
$itemNo.append($optionTypes);
var props = {
itemType: 'composition',
itemNo: compositionItemNo,
$itemList: $itemNo,
compositionLowerVendNo: compositionLowerVendNo
};
this.compositiondeliverychange({
itemNo: compositionItemNo
});
var buildImgUrl = function (path) {
var r = null;
if (path != isUndefined) {
var s0 = path[0];
var _imgDomain = itemApis.prefix.imgPath;
var _path = path;
if (s0 == 'r') {
_imgDomain = win.hasOwnProperty('UIPage') && win.UIPage.hasOwnProperty('itemUrl') ? (win.UIPage.itemUrl + '/') : '//item.elandrs.com/';
} else {
if (s0 != '/') {
_imgDomain = _imgDomain + '/';
}
}
r = _imgDomain + _path + '?w=48';
}
return r;
};
this.compositionitemchange({
type: 'expand',
$target: $el.closest('[data-compositionitem]'),
name: compositionItem.itemName,
idx: compositionItemNoIdx,
imgUrl: compositionItem.representImagePath != null ? buildImgUrl(compositionItem.representImagePath) : null
});
_this.product.bundle.run(props);
},
giftcheck: function ($el) {
var $target = $el.closest('li');
var $itemNo = $target.closest('[data-item_no]');
var itemNo = $itemNo.attr('data-item_no');
var uitemNo = $target.attr('data-uitem_no');
var uitemName = $target.attr('data-uitem_name');
var giftItemNo = $target.attr('data-giftitem_no');
var giftLowerVendNo = $target.attr('data-giftlowervend_no');
var $optionItem = $target.closest('[data-giftitem]');
var $selectName = $optionItem.find('[data-option-selectname]');
var $optionviewLists = $optionItem.find('[data-optionview-list]');
var $activeChilds = $optionviewLists.find('li').filter('[data-uitem_no="' + uitemNo + '"]');
for (var i = 0, max = $activeChilds.length; i < max; i++) {
var $activeChild = $activeChilds.eq(i);
$activeChild.siblings().removeClass('selected');
}
$activeChilds.addClass('selected');
$optionItem.attr('data-selected-value', uitemNo);
$selectName.text(uitemName);
var props = {
itemNo: itemNo,
giftValue: uitemName,
gift: {
itemNo: giftItemNo,
uitemNo: uitemNo,
lowerVendNo: giftLowerVendNo
}
};
if (this.lastItemData != null) {
props = Util.def({}, this.lastItemData, props);
this.lastItemData = null;
}
_this.product[_this.product.state].gift.run(props);
},
optionSoldoutcheck: function ($el) {
var checked = $el.prop('checked');
var $target = $el.closest('[data-options-flex]');
var $targetList = $target.find('[data-optionview-list]');
var $targetChilds = $targetList.find('>.sold_out');
if (checked) {
$el.attr('checked', 'checked');
$targetChilds.hide();
} else {
$el.removeAttr('checked');
$targetChilds.css('display', '');
}
}
}
});
},
buildFocusItem: function () {
var _this = this;
var classAttr = this.opts.classAttr;
Util.def(this, {
focustoggle: {
destroy: function () {
var childs = _this.$el.find(_this.opts.toggleBtn);
for (var i = 0, max = childs.length; i < max; i++) {
var child = childs.eq(i);
this.leave(child.parent(_this.opts.toggleList));
}
},
leave: function (el) {
if (!AllLayer.stateAttr.opened) {
el.removeClass(classAttr.active);
el.off('focusoutside mousedownoutside');
el.removeData('outsideEvent');
}
},
enter: function (el) {
var f = this;
if (el.data('outsideEvent') == isUndefined) {
el.data('outsideEvent', 'true');
el.addClass(classAttr.active);
el.on('focusoutside mousedownoutside', function (e) {
var ot = $(e.currentTarget);
f.leave(ot);
});
}
},
click: function (el) {
var child = el.parent(_this.opts.toggleList);
if (child.hasClass(classAttr.disabled)) return;
if (child.data('outsideEvent') == isUndefined) {
this.enter(child);
} else {
this.leave(child);
}
}
}
});
},
changeEvents: function (event) {
var events = [],
eventNames = event.split(' ');
for (var key in eventNames) {
events.push(eventNames[key] + this.opts.customEvent);
}
return events.join(' ');
},
bindEvents: function (type) {
if (type) {
this.$el.on(this.changeEvents('click'), '[data-optionitem] [data-optionview-list] a', this.itemClick.bind(this));
this.$el.on(this.changeEvents('change'), '[data-optionitem] [data-optionview-list] input', this.itemChange.bind(this));
this.$el.on(this.changeEvents('click'), '[data-optionitem] [data-calendar-active]', this.calClick.bind(this));
this.$el.on(this.changeEvents('click'), '[data-compositionitem] [data-optionview-list] a', this.compositionItemClick.bind(this));
this.$el.on(this.changeEvents('click'), '[data-giftitem] [data-optionview-list] a', this.giftClick.bind(this));
this.$el.on(this.changeEvents('change'), '[data-optionsoldout-check]', this.optionSoldoutChange.bind(this));
this.$el.on(this.changeEvents('click'), this.opts.toggleBtn, this.toggleFunc.bind(this));
this.$el.on(this.changeEvents('change'), '[data-jw-text]', this.jwtextChange.bind(this));
this.$el.on(this.changeEvents('click'), '[data-jw-push]', this.jwpushClick.bind(this));
} else {
this.$el.off(this.changeEvents('click'));
this.$el.off(this.changeEvents('change'));
}
},
itemClick: function (e) {
e.preventDefault();
if (this.loader.options.state) return;
var $t = $(e.currentTarget);
var $child = $t.closest('li');
if ($child.hasClass('sold_out')) return;
var $parentList = $t.closest('[data-toggle-list]');
var $toggleActive = $parentList.find('>[data-toggle-active]');
if ($parentList.hasClass('active')) {
$toggleActive.trigger('click');
}
if ($child.attr('data-jw-option') != isUndefined) {
if ($child.attr('data-option_length') == 'undefined') {
this.methods.jwformhide($parentList);
this.methods.itemcheck($t);
} else {
this.outCallback('selectedBefore');
this.methods.jwformshow($t);
}
} else {
this.outCallback('selectedBefore');
this.methods.itemcheck($t);
}
},
itemChange: function (e) {
if (this.loader.options.state) return;
var $t = $(e.currentTarget);
this.outCallback('selectedBefore');
this.methods.itemcheck($t);
},
calClick: function (e) {
e.preventDefault();
var classAttr = this.opts.classAttr;
var $t = $(e.currentTarget);
var $child = $t.closest('li');
if ($child.hasClass('sold_out')) return;
var $parentList = $t.closest('[data-toggle-list]');
if ($parentList.hasClass(classAttr.disabled)) return;
this.calendar.open({
$target: $t
});
},
compositionItemClick: function (e) {
e.preventDefault();
var $t = $(e.currentTarget);
var $child = $t.closest('li');
if ($child.hasClass('sold_out')) return;
var $parentList = $t.closest('[data-toggle-list]');
var $toggleActive = $parentList.find('>[data-toggle-active]');
if ($parentList.hasClass('active')) {
$toggleActive.trigger('click');
}
this.outCallback('selectedBefore');
this.methods.compositionitemcheck($t);
},
giftClick: function (e) {
e.preventDefault();
if (this.loader.options.state) return;
var $t = $(e.currentTarget);
var $child = $t.closest('li');
if ($child.hasClass('sold_out')) return;
var $parentList = $t.closest('[data-toggle-list]');
var $toggleActive = $parentList.find('>[data-toggle-active]');
if ($parentList.hasClass('active')) {
$toggleActive.trigger('click');
}
this.outCallback('selectedBefore');
this.methods.giftcheck($t);
},
optionSoldoutChange: function (e) {
if (this.loader.options.state) return;
var $t = $(e.currentTarget);
this.methods.optionSoldoutcheck($t);
},
toggleFunc: function (e) {
e.preventDefault();
var target = $(e.currentTarget);
this.focustoggle.click(target);
},
jwtextChange: function (e) {
var $t = $(e.currentTarget);
$t.attr('value', $t.val());
// console.log($t);
},
jwpushClick: function (e) {
e.preventDefault();
var $t = $(e.currentTarget);
var $child = $t.closest('[data-optionitem]');
var $jwTxt = $child.find('[data-jw-text]');
var tit = $child.attr('data-itemoptiontype_name');
var jwVal = $jwTxt.val();
if (jwVal.length) {
this.outCallback('selectedBefore');
this.methods.jwcheck($t);
} else {
win.alert(tit + ' 문구를 입력해 주세요.');
if (this.product.state == 'alone') {
this.product[this.product.state].prices.aloneDatas.reset();
}
$child.removeAttr('data-selected-text');
win.setTimeout(function () {
$jwTxt.focus();
}, 10);
}
},
reset: function () {
this.product.initialize();
this.loader.destroy();
},
destroy: function () {
this.bindEvents(false);
this.focustoggle.destroy();
this.loader.destroy();
this.product.destroy();
var $compositions = this.$optionSection.find('[data-composition_idx]');
$compositions.not(this.$basicOptionWrap).remove();
this.$basicOptionWrap.empty();
this.$basicGiftWrap.empty().hide();
this.$selectOptionWrap.empty().hide();
this.$priceOptionWrap.hide();
},
outCallback: function (ing, props) {
var callbackObj = this.opts.on[ing];
if (callbackObj == null) return;
callbackObj(props);
}
};
return Component;
})();
return Component;
}));
(function (global, factory) {
global = global;
global.itemDetailRelation = factory();
}(this, function () { 'use strict';
var Component = (function (isUndefined) {
var win = window,
$ = win.jQuery,
Util = win.EB.util;
function Component (container, args) {
var defParams = {
inner: '.cp-detail-relation__inner',
itemNo: null,
lowerVendNo: null,
itemCompositionDcode: null,
customEvent: '.Component' + (new Date()).getTime() + Math.random(),
};
this.opts = Util.def(defParams, (args || {}));
if (!(this.obj = $(container)).length) return;
this.init();
};
Component.prototype = {
init: function () {
if (this.opts.itemNo != null) {
this.setElements();
this.buildLayout();
this.buildParams();
this.buildScrollTarget();
}
},
setElements: function () {
this.$inner = this.obj.find(this.opts.inner);
},
buildLayout: function () {
var _this = this;
Util.def(this, {
layout: {
getSlide: function (prop) {
var layout = [];
layout.push(win.MacroUiItem(prop.data, {
wrapTag: 'div',
div: 'ui-item',
height: '260',
itemInfo: 'Y',
priceInfoDetails: {orgSellprice: 'Y', sellprice: 'Y', finalDcPrice: 'Y', dcRate: 'Y'},
wish: 'Y',
squareThumb: 'Y',
badge: 'Y',
icon: 'Y',
newCommingSoon: '',
sellingpoint: 'Y',
maxmembers: 'Y'
}));
layout.unshift('');
layout.push('
');
return layout.join('');
},
getSlides: function (props) {
var datas = props.datas;
var layout = [];
datas.forEach(function (data, idx) {
layout.push(this.getSlide({
data: data,
idx: idx
}));
}.bind(this));
return layout.join('');
},
getWrapper: function () {
var layout = [];
layout.push('');
layout.push('
');
layout.push('
');
layout.push('
');
layout.push('
');
layout.push('
이전으로 ');
layout.push('
다음으로 ');
layout.push('
');
return layout.join('');
},
build: function (items) {
if (items.length) {
_this.obj.css({
'height': '',
'opacity': ''
});
var getWrapper = this.getWrapper();
var $wrapper = $(getWrapper);
var getSlides = this.getSlides({
datas: items
});
var $getSlides = $(getSlides);
$wrapper.find('.swiper-wrapper').append($getSlides);
_this.$inner.append($wrapper);
Util.page.rerun({
target: _this.$inner
});
} else {
_this.obj.hide();
}
}
}
});
},
buildParams: function () {
var _this = this;
Util.def(this, {
params: {
getApi: function () {
var deferred = $.Deferred();
eAjax.get({
url: ApiDomain.www + '/api/i/item/associationitems/' + _this.opts.itemNo,
data: {
lowerVendNo: _this.opts.lowerVendNo,
itemCompositionDcode: _this.opts.itemCompositionDcode
},
}).done(function (response) {
deferred.resolve(response);
}).fail(function () {
deferred.reject();
});
return deferred.promise();
}
}
});
},
buildScrollTarget: function () {
var _this = this;
Util.def(this, {
scrolltarget: {
instance: null,
destroy: function () {
if (this.instance == null) return;
this.instance.destroy();
this.instance = null;
},
build: function () {
this.instance = new ScrollTarget(_this.obj, {
on: {
complete: function () {
_this.params.getApi().done(function (response) {
_this.layout.build(response.data);
});
}
}
});
}
}
});
this.scrolltarget.build();
},
destroy: function () {
this.scrolltarget.destroy();
}
};
return Component;
})();
return Component;
}));
(function () {
$(function () {
var win = window;
var doc = win.document;
var couponsForItemDetail = {
init: function () {
this.setElements();
this.buildAwaitLoader();
this.buildLayout();
this.bindEvents();
},
setElements: function () {
this.$body = $('body');
},
buildAwaitLoader: function () {
var _this = this;
gUtil.def(this, {
awaitloader: {
instance: null,
destroy: function () {
if (this.instance == null) return;
this.instance.destroy();
this.instance = null;
},
build: function () {
this.destroy();
this.instance = new AwaitLoader(_this.$body);
}
}
});
},
buildLayout: function () {
var $body = this.$body;
let downloadableQty = 0;
let issuablePromNos = [];
gUtil.def(this, {
layout: {
getCpnLayer: function () {
var $layer = $('#DownCouponList');
if (!$layer.length) {
var layouts = [];
layouts.push('');
layouts.push('
');
layouts.push('
');
layouts.push('
');
layouts.push('
');
layouts.push('
팝업 닫기 ');
layouts.push('
');
layouts.push('');
layouts.push('
');
layouts.push('
');
layouts.push('
');
layouts.push('
4건 전체받기 ');
layouts.push('
');
layouts.push('
');
layouts.push('
');
layouts.push('
');
layouts.push('
');
var $layout = $(layouts.join(''));
$body.append($layout);
$layer = $layout;
new CmLayer($layer);
}
return $layer;
},
getPromotion: function (prom) {
if ('배송비쿠폰' === prom.promKindGroupName && '10' !== prom.shipTakebackDcode) {
return;
}
var layouts = [];
let benefitValue = prom.benefitValue;
// 혜택값구분코드(PR0018) 율(10) 금액(20)
if ("20" === prom.benefitValueDcode) {
benefitValue = DGDUtil.addComma(benefitValue);
}
let issuable = prom.couponDownloadAvailQty > 0;
layouts.push('');
layouts.push('');
layouts.push('
');
layouts.push('' + benefitValue + ' ' + (prom.benefitValueDcode === "20" ? '원' : '%') + ' ');
layouts.push('' + prom.promName + ' ');
let minValue = 0;
let maxDcAmount = prom.maxDcAmount;
if ("10" === prom.promApplyLevelTcode) { // 상품단위할인
// Mini_Item_Sell_UnitPrice 이상 사용가능
// sellPrice >= Mini_Item_Sell_UnitPrice 일시 사용가능
if (prom.miniItemSellUnitprice > 0) {
minValue = prom.miniItemSellUnitprice;
}
} else if ("20" === prom.promApplyLevelTcode) { // 주문단위할인
// miniOrdAmount 이상 사용가능
if (prom.miniOrdAmount > 0) {
minValue = prom.miniOrdAmount;
}
if ("배송비쿠폰" === prom.promKindGroupName) {
maxDcAmount = prom.maxShipcostAmount;
}
}
// 혜택 조건
// minValue 이상 구매 시
let couponInfoLayouts = [];
if (minValue) {
minValue = this.formatAmount(minValue);
couponInfoLayouts.push('' + minValue + '원 이상 구매 시' + ' ');
}
// 최대 maxValue 할인
let maxValue = 0;
if (0 < maxDcAmount && maxDcAmount < 99999999) {
maxValue = this.formatAmount(maxDcAmount);
}
if (maxValue) {
couponInfoLayouts.push('' + '최대 ' + maxValue + '원 할인' + ' ');
}
// coupon_issue_limit_qty_dcode 무제한(00 or null) / 개인별(10)
let individual = '';
if ("10" === prom.couponIssueLimitQtyDcode) {
let limitQtyPerId = prom.couponIssueLimitQty;
individual = 'ID당 ' + limitQtyPerId + '장 ';
}
if (individual) {
const len = couponInfoLayouts.length;
if (couponInfoLayouts.length) {
couponInfoLayouts[len - 1] = couponInfoLayouts[len - 1].replace('', individual + '');
} else {
couponInfoLayouts.push('' + individual + ' ');
}
}
if (couponInfoLayouts.length) {
layouts.push(...couponInfoLayouts);
}
layouts.push('' + prom.promStartDate + '~' + prom.promEndDate + ' ');
layouts.push('
');
layouts.push('
');
layouts.push('');
layouts.push('' + (issuable ? "받기" : "발급완료") + ' ');
layouts.push(' ');
layouts.push(' ');
// prom_media_tcode 프로모션매체유형코드(PR0031) 00공통 10PC 30MOBILE 40APP
if (prom.promMediaTcode === "40") {
layouts.push('
APP ');
}
layouts.push('
');
layouts.push(' ');
if (issuable) {
downloadableQty += 1;
issuablePromNos.push(prom.promNo);
}
return layouts.join('');
},
getPromotions: function (promotions) {
downloadableQty = 0;
issuablePromNos = [];
let layouts = [];
const groupedByPromKindGroupName = promotions.reduce((acc, prom) => {
const promKindGroupName = prom.promKindGroupName;
if (!acc[promKindGroupName]) {
acc[promKindGroupName] = [];
}
acc[promKindGroupName].push(prom);
return acc;
}, {});
Object.entries(groupedByPromKindGroupName).forEach(([promKindGroupName, promotions]) => {
layouts.push('' + promKindGroupName + ' ');
promotions.forEach(prom => {
layouts.push(this.getPromotion(prom));
});
layouts.push(' ');
});
return layouts.join('');
},
formatAmount: function (amount) {
if (amount < 10000) {
return DGDUtil.addComma(amount);
}
return (amount.toFixed(1) / 10000) + "만";
},
build: function (data) {
const $cpnLayer = this.getCpnLayer();
const $appendWrap = $cpnLayer.find('.inner-scroll__wrap');
const $downloadAllButtons = $cpnLayer.find('[data-download-all-coupons]');
const $cpnDesc = $cpnLayer.find('#couponDesc');
const $cpnAllBtn = $cpnLayer.find('.mypage-box-btn .btn_type_black');
$cpnAllBtn.off('coupondown.done').on('coupondown.done', function (params) {
var $cpnBtn = $(params.currentTarget);
var $openLayer = $cpnBtn.closest('#DownCouponList');
$openLayer.trigger('closeLayer');
});
if (!Array.isArray(data) || !data.length) {
$cpnDesc.hide();
$appendWrap.find('.coupon-list__wrap').remove();
$appendWrap.prepend($(''));
} else {
const promotions = this.getPromotions(data);
const $promotions = $(promotions);
$cpnDesc.css('display', '');
$appendWrap.find('.coupon-list__wrap').remove();
$appendWrap.prepend($promotions);
let $btnTypeBlack = $downloadAllButtons.parent();
$btnTypeBlack.attr('data-login-promise', getLoginPromiseData("coupon"));
$btnTypeBlack.attr('data-prom-no', issuablePromNos.join(','));
$downloadAllButtons.text(downloadableQty + '건 전체 받기');
}
win.setTimeout(function () {
$cpnLayer.trigger('openLayer');
}, 0);
}
}
})
},
bindEvents: function () {
$(doc).on('click', '[data-select-coupons]', this.couponsClick.bind(this));
},
couponsClick: function (e) {
e.preventDefault();
var $t = $(e.currentTarget);
var _itemNo = $t.data('itemno');
var _lowervendNo = $t.data('lowervendno');
var _manualapplycouponpossYn = $t.data('manualapplycoupon_poss_yn');
var complete = function () {
this.awaitloader.destroy();
}.bind(this);
this.awaitloader.build();
let url = itemApis.prefix.couponApi.replace("{itemNo}", _itemNo).replace("{lowerVendNo}", _lowervendNo);
eAjax.get({
url: url,
data: {
manualApplyCouponPossYn: _manualapplycouponpossYn,
},
complete: function () {
complete();
},
}).done(function (response) {
if (response.resultCode === "200") {
this.layout.build(response.data.promotions);
}
}.bind(this));
},
};
couponsForItemDetail.init();
});
})();